筆記國度

在這裡放著一些我自己的筆記

設定 Google Play Developer API Service Account

| Comments

設定 Google Play Developer API Service Account

http://stackoverflow.com/questions/25481207/why-getting-error-the-project-id-used-to-call-the-google-play-developer-api-has

Google Developer Console

https://console.developers.google.com

  • 然後 選擇 奇幻射擊2 中文版 的專案
  • 進去以後 先在左側的 API 和驗證 底下的 API 點一下
  • 然後搜尋 Google Play Android Developer API
  • 幫我啟用
  • 然後再到 API 和驗證 底下的 憑證 點一下
  • 建立一個新的用戶端 ID
  • 應用程式類型 要點 服務帳戶
  • 最後按下建立用戶端 ID

Google Play Developer Console

https://play.google.com/apps/publish

  1. Google Play Developer Console > Settings > subcategory API access.
  2. Make a link to your Linked Project.
  3. Service Account place maybe already showing ur Service account CLIENT ID which made google developer console.

Default this account gray showing and isn't active. So must activate and set authority manually.

You should now get a correct response from the API.

Good luck.

給予 Service Account 驗證 IAP 的權限

  • You must to connect your API with your app.
  • You must go to your Google Play publish page and invite a user with the service account email in Settings -> User account & rights -> Invite new user
  • give it the privileges of View financial reports.

程式範例

http://stackoverflow.com/questions/25054919/get-android-subscription-status-failed-with-403/25825907#25825907

<?php
    set_include_path("../src/" . PATH_SEPARATOR . get_include_path());
    require_once 'Google/Client.php';
    require_once 'Google/Service/AndroidPublisher.php';

    $client_id = ''; //Your client id
    $service_account_name = ''; //Your service account email
    $key_file_location = ''; //Your p12 file (key.p12)

    $client = new Google_Client();
    $client->setApplicationName(""); //This is the name of the linked application
    $service = new Google_Service_AndroidPublisher($client);

    $key = file_get_contents($key_file_location);
    $cred = new Google_Auth_AssertionCredentials(
        $service_account_name,
        array('https://www.googleapis.com/auth/androidpublisher'),
        $key
    );
    $client->setAssertionCredentials($cred);
    if($client->getAuth()->isAccessTokenExpired()) {
        $client->getAuth()->refreshTokenWithAssertion($cred);
    }
    $apiKey = ""; //Your API key
    $client->setDeveloperKey($apiKey);

    $package_name = ""; //Your package name (com.example...)
    $subscriptionId = "";   //SKU of your subscription item

    //Token returned to the app after the purchase
    $token = "";

    $service = new Google_Service_AndroidPublisher($client);
    $results = $service->purchases_subscriptions->get($package_name,$subscriptionId,$token,array());

    print_r ($results); //This object has all the data about the subscription
    echo "expiration: " . $results->expiryTimeMillis;
    exit;
?>

使用 Chrome 的 POSTMAN 來手動確認 Apple IAP 訂單

| Comments

處理玩家客訴的時候會用到。

安裝 POSTMAN

開始驗證資料

  • 網址:https://buy.itunes.apple.com/verifyReceipt
  • 協定選擇 POST
  • 取得 receipt-data
{
    "signature" = "ApdxJdtNwPU2rA5/cn3kIO1OTk25feDKa0aagyyRveWlcFlglv6RF6znkiBS3um9Uc7pVob+PqZR2T8wyVrHNplof3DX3IqDOlWq+90a7Yl+qrR7A7jWwviw708PS+67PyHRnhO/G7bVqgRpEr6EuFybiU1FXAiXJc6ls1YAssQxAAADVzCCA1MwggI7oAMCAQICCGUUkU3ZWAS1MA0GCSqGSIb3DQEBBQUAMH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAwwqQXBwbGUgaVR1bmVzIFN0b3JlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MDYxNTIyMDU1NloXDTE0MDYxNDIyMDU1NlowZDEjMCEGA1UEAwwaUHVyY2hhc2VSZWNlaXB0Q2VydGlmaWNhdGUxGzAZBgNVBAsMEkFwcGxlIGlUdW5lcyBTdG9yZTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrRjF2ct4IrSdiTChaI0g8pwv/cmHs8p/RwV/rt/91XKVhNl4XIBimKjQQNfgHsDs6yju++DrKJE7uKsphMddKYfFE5rGXsAdBEjBwRIxexTevx3HLEFGAt1moKx509dhxtiIdDgJv2YaVs49B0uJvNdy6SMqNNLHsDLzDS9oZHAgMBAAGjcjBwMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUNh3o4p2C0gEYtTJrDtdDC5FYQzowDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBSpg4PyGUjFPhJXCBTMzaN+mV8k9TAQBgoqhkiG92NkBgUBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAEaSbPjtmN4C/IB3QEpK32RxacCDXdVXAeVReS5FaZxc+t88pQP93BiAxvdW/3eTSMGY5FbeAYL3etqP5gm8wrFojX0ikyVRStQ+/AQ0KEjtqB07kLs9QUe8czR8UGfdM1EumV/UgvDd4NwNYxLQMg4WTQfgkQQVy8GXZwVHgbE/UC6Y7053pGXBk51NPM3woxhd3gSRLvXj+loHsStcTEqe9pBDpmG5+sk4tw+GK3GMeEN5/+e1QT9np/Kl1nj+aBw7C0xsy0bFnaAd1cSS6xdory/CUvM6gtKsmnOOdqTesbp0bs8sn6Wqs0C9dgcxRHuOMZ2tm8npLUm7argOSzQ==";
    "purchase-info" = "ewoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtcHN0IiA9ICIyMDEyLTA3LTEyIDA1OjU0OjM1IEFtZXJpY2EvTG9zX0FuZ2VsZXMiOwoJInB1cmNoYXNlLWRhdGUtbXMiID0gIjEzNDIwOTc2NzU4ODIiOwoJIm9yaWdpbmFsLXRyYW5zYWN0aW9uLWlkIiA9ICIxNzAwMDAwMjk0NDk0MjAiOwoJImJ2cnMiID0gIjEuNCI7CgkiYXBwLWl0ZW0taWQiID0gIjQ1MDU0MjIzMyI7CgkidHJhbnNhY3Rpb24taWQiID0gIjE3MDAwMDAyOTQ0OTQyMCI7CgkicXVhbnRpdHkiID0gIjEiOwoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtbXMiID0gIjEzNDIwOTc2NzU4ODIiOwoJIml0ZW0taWQiID0gIjUzNDE4NTA0MiI7CgkidmVyc2lvbi1leHRlcm5hbC1pZGVudGlmaWVyIiA9ICI5MDUxMjM2IjsKCSJwcm9kdWN0LWlkIiA9ICJjb20uemVwdG9sYWIuY3RyYm9udXMuc3VwZXJwb3dlcjEiOwoJInB1cmNoYXNlLWRhdGUiID0gIjIwMTItMDctMTIgMTI6NTQ6MzUgRXRjL0dNVCI7Cgkib3JpZ2luYWwtcHVyY2hhc2UtZGF0ZSIgPSAiMjAxMi0wNy0xMiAxMjo1NDozNSBFdGMvR01UIjsKCSJiaWQiID0gImNvbS56ZXB0b2xhYi5jdHJleHBlcmltZW50cyI7CgkicHVyY2hhc2UtZGF0ZS1wc3QiID0gIjIwMTItMDctMTIgMDU6NTQ6MzUgQW1lcmljYS9Mb3NfQW5nZWxlcyI7Cn0=";
    "pod" = "17";
    "signing-status" = "0";
}
ew0KCSJzaWduYXR1cmUiID0gIkFwZHhKZHROd1BVMnJBNS9jbjNrSU8xT1RrMjVmZURLYTBhYWd5eVJ2ZVdsY0ZsZ2x2NlJGNnpua2lCUzN1bTlVYzdwVm9iK1BxWlIyVDh3eVZySE5wbG9mM0RYM0lxRE9sV3ErOTBhN1lsK3FyUjdBN2pXd3ZpdzcwOFBTKzY3UHlIUm5oTy9HN2JWcWdScEVyNkV1RnliaVUxRlhBaVhKYzZsczFZQXNzUXhBQUFEVnpDQ0ExTXdnZ0k3b0FNQ0FRSUNDR1VVa1UzWldBUzFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1IOHhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1TWXdKQVlEVlFRTERCMUJjSEJzWlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV6TURFR0ExVUVBd3dxUVhCd2JHVWdhVlIxYm1WeklGTjBiM0psSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBNU1EWXhOVEl5TURVMU5sb1hEVEUwTURZeE5ESXlNRFUxTmxvd1pERWpNQ0VHQTFVRUF3d2FVSFZ5WTJoaGMyVlNaV05sYVhCMFEyVnlkR2xtYVdOaGRHVXhHekFaQmdOVkJBc01Fa0Z3Y0d4bElHbFVkVzVsY3lCVGRHOXlaVEVUTUJFR0ExVUVDZ3dLUVhCd2JHVWdTVzVqTGpFTE1Ba0dBMVVFQmhNQ1ZWTXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTXJSakYyY3Q0SXJTZGlUQ2hhSTBnOHB3di9jbUhzOHAvUndWL3J0LzkxWEtWaE5sNFhJQmltS2pRUU5mZ0hzRHM2eWp1KytEcktKRTd1S3NwaE1kZEtZZkZFNXJHWHNBZEJFakJ3Ukl4ZXhUZXZ4M0hMRUZHQXQxbW9LeDUwOWRoeHRpSWREZ0p2MllhVnM0OUIwdUp2TmR5NlNNcU5OTEhzREx6RFM5b1pIQWdNQkFBR2pjakJ3TUF3R0ExVWRFd0VCL3dRQ01BQXdId1lEVlIwakJCZ3dGb0FVTmgzbzRwMkMwZ0VZdFRKckR0ZERDNUZZUXpvd0RnWURWUjBQQVFIL0JBUURBZ2VBTUIwR0ExVWREZ1FXQkJTcGc0UHlHVWpGUGhKWENCVE16YU4rbVY4azlUQVFCZ29xaGtpRzkyTmtCZ1VCQkFJRkFEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFFYVNiUGp0bU40Qy9JQjNRRXBLMzJSeGFjQ0RYZFZYQWVWUmVTNUZhWnhjK3Q4OHBRUDkzQmlBeHZkVy8zZVRTTUdZNUZiZUFZTDNldHFQNWdtOHdyRm9qWDBpa3lWUlN0USsvQVEwS0VqdHFCMDdrTHM5UVVlOGN6UjhVR2ZkTTFFdW1WL1VndkRkNE53Tll4TFFNZzRXVFFmZ2tRUVZ5OEdYWndWSGdiRS9VQzZZNzA1M3BHWEJrNTFOUE0zd294aGQzZ1NSTHZYaitsb0hzU3RjVEVxZTlwQkRwbUc1K3NrNHR3K0dLM0dNZUVONS8rZTFRVDlucC9LbDFuaithQnc3QzB4c3kwYkZuYUFkMWNTUzZ4ZG9yeS9DVXZNNmd0S3Ntbk9PZHFUZXNicDBiczhzbjZXcXMwQzlkZ2N4Ukh1T01aMnRtOG5wTFVtN2FyZ09TelE9PSI7DQoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ERXlMVEEzTFRFeUlEQTFPalUwT2pNMUlFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5CMWNtTm9ZWE5sTFdSaGRHVXRiWE1pSUQwZ0lqRXpOREl3T1RjMk56VTRPRElpT3dvSkltOXlhV2RwYm1Gc0xYUnlZVzV6WVdOMGFXOXVMV2xrSWlBOUlDSXhOekF3TURBd01qazBORGswTWpBaU93b0pJbUoyY25NaUlEMGdJakV1TkNJN0Nna2lZWEJ3TFdsMFpXMHRhV1FpSUQwZ0lqUTFNRFUwTWpJek15STdDZ2tpZEhKaGJuTmhZM1JwYjI0dGFXUWlJRDBnSWpFM01EQXdNREF5T1RRME9UUXlNQ0k3Q2draWNYVmhiblJwZEhraUlEMGdJakVpT3dvSkltOXlhV2RwYm1Gc0xYQjFjbU5vWVhObExXUmhkR1V0YlhNaUlEMGdJakV6TkRJd09UYzJOelU0T0RJaU93b0pJbWwwWlcwdGFXUWlJRDBnSWpVek5ERTROVEEwTWlJN0Nna2lkbVZ5YzJsdmJpMWxlSFJsY201aGJDMXBaR1Z1ZEdsbWFXVnlJaUE5SUNJNU1EVXhNak0ySWpzS0NTSndjbTlrZFdOMExXbGtJaUE5SUNKamIyMHVlbVZ3ZEc5c1lXSXVZM1J5WW05dWRYTXVjM1Z3WlhKd2IzZGxjakVpT3dvSkluQjFjbU5vWVhObExXUmhkR1VpSUQwZ0lqSXdNVEl0TURjdE1USWdNVEk2TlRRNk16VWdSWFJqTDBkTlZDSTdDZ2tpYjNKcFoybHVZV3d0Y0hWeVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE1pMHdOeTB4TWlBeE1qbzFORG96TlNCRmRHTXZSMDFVSWpzS0NTSmlhV1FpSUQwZ0ltTnZiUzU2WlhCMGIyeGhZaTVqZEhKbGVIQmxjbWx0Wlc1MGN5STdDZ2tpY0hWeVkyaGhjMlV0WkdGMFpTMXdjM1FpSUQwZ0lqSXdNVEl0TURjdE1USWdNRFU2TlRRNk16VWdRVzFsY21sallTOU1iM05mUVc1blpXeGxjeUk3Q24wPSI7DQoJInBvZCIgPSAiMTciOw0KCSJzaWduaW5nLXN0YXR1cyIgPSAiMCI7DQp9
  • 將 base64 的訂單資料組合成 JSON 格式如下
{
    "receipt-data": "ew0KCSJzaWduYXR1cmUiID0gIkFwZHhKZHROd1BVMnJBNS9jbjNrSU8xT1RrMjVmZURLYTBhYWd5eVJ2ZVdsY0ZsZ2x2NlJGNnpua2lCUzN1bTlVYzdwVm9iK1BxWlIyVDh3eVZySE5wbG9mM0RYM0lxRE9sV3ErOTBhN1lsK3FyUjdBN2pXd3ZpdzcwOFBTKzY3UHlIUm5oTy9HN2JWcWdScEVyNkV1RnliaVUxRlhBaVhKYzZsczFZQXNzUXhBQUFEVnpDQ0ExTXdnZ0k3b0FNQ0FRSUNDR1VVa1UzWldBUzFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1IOHhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1TWXdKQVlEVlFRTERCMUJjSEJzWlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV6TURFR0ExVUVBd3dxUVhCd2JHVWdhVlIxYm1WeklGTjBiM0psSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBNU1EWXhOVEl5TURVMU5sb1hEVEUwTURZeE5ESXlNRFUxTmxvd1pERWpNQ0VHQTFVRUF3d2FVSFZ5WTJoaGMyVlNaV05sYVhCMFEyVnlkR2xtYVdOaGRHVXhHekFaQmdOVkJBc01Fa0Z3Y0d4bElHbFVkVzVsY3lCVGRHOXlaVEVUTUJFR0ExVUVDZ3dLUVhCd2JHVWdTVzVqTGpFTE1Ba0dBMVVFQmhNQ1ZWTXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTXJSakYyY3Q0SXJTZGlUQ2hhSTBnOHB3di9jbUhzOHAvUndWL3J0LzkxWEtWaE5sNFhJQmltS2pRUU5mZ0hzRHM2eWp1KytEcktKRTd1S3NwaE1kZEtZZkZFNXJHWHNBZEJFakJ3Ukl4ZXhUZXZ4M0hMRUZHQXQxbW9LeDUwOWRoeHRpSWREZ0p2MllhVnM0OUIwdUp2TmR5NlNNcU5OTEhzREx6RFM5b1pIQWdNQkFBR2pjakJ3TUF3R0ExVWRFd0VCL3dRQ01BQXdId1lEVlIwakJCZ3dGb0FVTmgzbzRwMkMwZ0VZdFRKckR0ZERDNUZZUXpvd0RnWURWUjBQQVFIL0JBUURBZ2VBTUIwR0ExVWREZ1FXQkJTcGc0UHlHVWpGUGhKWENCVE16YU4rbVY4azlUQVFCZ29xaGtpRzkyTmtCZ1VCQkFJRkFEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFFYVNiUGp0bU40Qy9JQjNRRXBLMzJSeGFjQ0RYZFZYQWVWUmVTNUZhWnhjK3Q4OHBRUDkzQmlBeHZkVy8zZVRTTUdZNUZiZUFZTDNldHFQNWdtOHdyRm9qWDBpa3lWUlN0USsvQVEwS0VqdHFCMDdrTHM5UVVlOGN6UjhVR2ZkTTFFdW1WL1VndkRkNE53Tll4TFFNZzRXVFFmZ2tRUVZ5OEdYWndWSGdiRS9VQzZZNzA1M3BHWEJrNTFOUE0zd294aGQzZ1NSTHZYaitsb0hzU3RjVEVxZTlwQkRwbUc1K3NrNHR3K0dLM0dNZUVONS8rZTFRVDlucC9LbDFuaithQnc3QzB4c3kwYkZuYUFkMWNTUzZ4ZG9yeS9DVXZNNmd0S3Ntbk9PZHFUZXNicDBiczhzbjZXcXMwQzlkZ2N4Ukh1T01aMnRtOG5wTFVtN2FyZ09TelE9PSI7DQoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ERXlMVEEzTFRFeUlEQTFPalUwT2pNMUlFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5CMWNtTm9ZWE5sTFdSaGRHVXRiWE1pSUQwZ0lqRXpOREl3T1RjMk56VTRPRElpT3dvSkltOXlhV2RwYm1Gc0xYUnlZVzV6WVdOMGFXOXVMV2xrSWlBOUlDSXhOekF3TURBd01qazBORGswTWpBaU93b0pJbUoyY25NaUlEMGdJakV1TkNJN0Nna2lZWEJ3TFdsMFpXMHRhV1FpSUQwZ0lqUTFNRFUwTWpJek15STdDZ2tpZEhKaGJuTmhZM1JwYjI0dGFXUWlJRDBnSWpFM01EQXdNREF5T1RRME9UUXlNQ0k3Q2draWNYVmhiblJwZEhraUlEMGdJakVpT3dvSkltOXlhV2RwYm1Gc0xYQjFjbU5vWVhObExXUmhkR1V0YlhNaUlEMGdJakV6TkRJd09UYzJOelU0T0RJaU93b0pJbWwwWlcwdGFXUWlJRDBnSWpVek5ERTROVEEwTWlJN0Nna2lkbVZ5YzJsdmJpMWxlSFJsY201aGJDMXBaR1Z1ZEdsbWFXVnlJaUE5SUNJNU1EVXhNak0ySWpzS0NTSndjbTlrZFdOMExXbGtJaUE5SUNKamIyMHVlbVZ3ZEc5c1lXSXVZM1J5WW05dWRYTXVjM1Z3WlhKd2IzZGxjakVpT3dvSkluQjFjbU5vWVhObExXUmhkR1VpSUQwZ0lqSXdNVEl0TURjdE1USWdNVEk2TlRRNk16VWdSWFJqTDBkTlZDSTdDZ2tpYjNKcFoybHVZV3d0Y0hWeVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE1pMHdOeTB4TWlBeE1qbzFORG96TlNCRmRHTXZSMDFVSWpzS0NTSmlhV1FpSUQwZ0ltTnZiUzU2WlhCMGIyeGhZaTVqZEhKbGVIQmxjbWx0Wlc1MGN5STdDZ2tpY0hWeVkyaGhjMlV0WkdGMFpTMXdjM1FpSUQwZ0lqSXdNVEl0TURjdE1USWdNRFU2TlRRNk16VWdRVzFsY21sallTOU1iM05mUVc1blpXeGxjeUk3Q24wPSI7DQoJInBvZCIgPSAiMTciOw0KCSJzaWduaW5nLXN0YXR1cyIgPSAiMCI7DQp9"
}
  • 選擇 body 分頁
  • 選擇 raw 屬性
  • 貼上 JSON 資料
  • 送出資料

  • 選擇 JSON 格式的輸出

備註

這個訂單資料是來自免費內購的破解軟體的訂單資料,故不做隱碼處理。

能支持 10 萬個 Git 倉庫的硬件平台

| Comments

翻譯文章出處

如果你想要託管項目,可以考慮 GitLab.com ,在這個網站上我們運行了一個單實例的 GitLab。目前有將近 20000 個用戶在使用這個服務。單台機器上有超過 10 萬個項目託管之上。

單一服務器

之前 GitLab.com 是運行在亞馬遜的 AWS 平台上,使用的是 AWS 上最高的配置實例。但是由於用戶的不斷增長,AWS 單實例已經無法滿足我們的需要,特別是 CPU 和存儲方面的限制。我們必須尋找一種替代解決方案。

10萬個倉庫需要佔用好多個 TB 的存儲,因此存儲能力至關重要。而因為我們使用的是 Git,因此存儲必須是一個單一的文件系統,而不能是類似亞馬遜提供的 S3 對象存儲服務。我們希望能夠輕鬆擴展存儲。此外大量的人提交和下載代碼對系統的 CPU 要求也非常高,因此擁有更多的 CPU 核有助於在高負載的情況下提升響應速度。
看來最具性價比的方案是使用自己的服務器了。好在 GitLab 可以很方便的運行之上。

And 因此,我們目前採購了兩台獨立服務器用來運行 GitLab.com,其中一台是活動的主服務器,另外一台備用。服務器配置如下:

  • 服務器型號: HP DL180 G6 (2009 生產)
  • 處理器: 2x X5690 (共 24 核)
  • 32GB RAM
  • 12x 2TB HDDs, (其中兩個用於 root 卷,使用 RAID 1,另外 10 個磁盤使用 RAID 10 ext4 文件系統)

我們實際上只用了其中的 16 核。

故障以及故障轉移

從亞馬遜上遷移出來意味著我們不能再利用 AWS 平台的一些特性,因此一旦服務器宕機我們需要一些故障轉移的措施。

我們需要使用 DRBD 來創建主從服務器架構,同一時間只有一個應用服務器是活動的,一旦出問題就會讓 DRBD 切換到另外一台服務器。

我們的 DRBD 工具可通過 subscribers 獲取。

未來的擴展性

GitLab.com 在當前的硬件平台上運行良好,但其增長越來越快。如果對現有的硬件進行擴展,其成本是很高的,而且有些部分是很難的。

將來 GitLab.com 將再次託管到亞馬遜的 AWS 平台上,這可以讓我們很容易的實現水平的擴展。此外亞馬遜剛剛宣佈了超過 10TB 的 ESB 卷,這將讓我們的移植變得容易。

繁簡轉換教學

| Comments

繁簡轉換教學

  1. 取得 MediaWiki 的辭庫,請到 https://www.mediawiki.org/wiki/Download 下載最新版的程式碼,並用 7-Zip 解壓縮。
  2. includes/ZHConversion.php 另存新檔。
  3. 撰寫 php 程式碼如下:
<?php
class ZHConversion
{
    private $zh2Hant, $zh2Hans;
    
    function __construct()
    {
        require('ZHConversion.php');
        $this->zh2Hant = $zh2Hant;
        $this->zh2Hans = $zh2Hans;
    }
    
    public function tt( $str )
    {
        return strtr( $str, $this->zh2Hant );
    }
    
    public function ts( $str )
    {
        return strtr( $str, $this->zh2Hans );
    }
}
$zhc = new ZHConversion();
$hans_str = "硬盘上无法修复的坏轨,可能导致硬盘使用上产生异常的现象,例如:存取缓慢、当机、档案毁损等症状发生。最近上市的固态硬盘也会使用广泛使用于 DRAM 内存的 ECC 技术来保护快闪存储器资料。";
echo $zhc->tt($hans_str);

[raspberrypi] 生產 ssh, 複製公鑰, keychain 管理

| Comments

生產 ssh 公私鑰

ssh-keygen -t dsa, ssh-keygen -t rsa
http://portable.easylife.tw/1912 這篇文章中有特別說明, dsa 支援 ssh 2, rsa 支援 ssh 1,2 , 若需要支援度較高,可選用 rsa, 若想要安全性較高,應選用 dsa。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/taichunmin/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/taichunmin/.ssh/id_dsa.
Your public key has been saved in /home/taichunmin/.ssh/id_dsa.pub.

部屬 ssh 公鑰以便快速登入其他伺服器

ssh-copy-id -i ~/.ssh/id_dsa.pub taichunmin@example.com
使用這行指令,代表以後可以依靠 ssh key 登入 taichunmin@example.com

使用 keychain 儲存 ssh key 的 passphrase

apt-get install keychain: 安裝 keychain
/usr/bin/keychain ~/.ssh/id_rsa: 新增 ssh key 進行管理
source ~/.keychain/${HOSTNAME}-sh > /dev/null: 執行 keychain

編寫腳本自動執行 keychain

nano ~/.bashrc

# Start keychain
/usr/bin/keychain
source ~/.keychain/${HOSTNAME}-sh > /dev/null

DNS list in SetDNS App

| Comments

  • Google DNS

8.8.8.8
8.8.4.4

  • OpenDNS

208.67.222.222
208.67.220.220

  • FoolDNS

87.118.111.215
80.79.54.55

  • OpenDNS Family Shield

208.67.222.123
208.67.220.123

  • Level 3

4.2.2.1
4.2.2.2

  • Symantec

198.153.192.1
198.153.194.1

  • Scrublt

67.138.54.100
207.225.209.66

  • dnsadvantage

156.154.70.1
156.154.71.1

  • OpenNIC IN/CO

66.244.95.20
216.87.84.211

  • OpenNIC AU/TX

202.83.95.227
69.164.196.21

  • Google DNS IPv6

2001:4860:4860::8888
2001:4860:4860::8844

  • OpenDNS IPv6

2620:0:ccc::2
2620:0:ccd::2

[SITCON] 2014 參加心得 & 講師

| Comments

網路資源區

IRC 回應區

14:53 < MrQ> R0 程式碼有點小 然後應該是 C++ ?

這份程式碼沒寫的很好,不好意思放太大。

14:55 < UncleHandsome> yacc bison太久了吧

這個其實是 SyncArt 跟我建議的,冤有頭債有主阿(X。好啦,其實我覺的這個應該是編譯器不可或缺的一塊,但是大概只有想刻出新的程式語言的人才有需要吧。

14:58 < darkx> 結果 R0 都在講 RE 相關的東西而不是 RE 本身 XDDD

這個....我承認因為時間縮短的關係,被我砍了,我原本投 40 min 的時候有打算講。後來重心就在網路資源上了。

14:59 < darkx> PCRE 明明去看 perldoc re 就好

這個議題的目標是不知道正規表示法是啥,或者是還沒有深入學習正規表示法的人,讓他們可以少走一些彎路。因為我沒有學過 Perl,所以不知道有 PERLDOC 的存在,Sorry 啦(教學相長XD)。

14:58 < dannyAAM> 中文網址實際上也不會有ASCII外的字啊(無誤

看來我觀念錯誤了,糗。

14:59 < MrQ> R0 請把 Regex 轉成英文再 google 才找得到東西(?)
14:59 < UncleHandsome> 全英文錯了嘛

這只是我的經驗談啦,鞭小力一點XDD

15:00 < jserv--> [R0] http://regexcrossword.com/

這我當初在玩的時候也頗驚奇的,創意無限阿XD

15:00 < divazone_> 我想吃點心QAQQQQQQQQQ

失策,居然是點心前的場,大家想吃點心我也想吃阿 (X

15:00 < MrQ> R0 又提到 TwitchPlayPokemon 惹

原本我還頗開心我上台以前都沒聽到有人提這個梗,結果居然被 R2 搶先了 QAQ

15:02 < Davy_CC> [R0] 這為什麼需要 regex 啊XDDDD

只是想讓沒學過的人想像看看,用了正規表達式可以節省多少程式碼,出這個只是配合時事啦。

15:02 < darkx> ([(up)|(down)|(left)|(right)|(a)|(b)|(start)]\d?)+
15:02 < dannyAAM> 啥啊wwwwww
15:02 < divazone_> 不是吧wwwww

我投影片底下有偷偷留一份我寫的範例啦。你寫的這個好像在 PCRE 不能用喔。

心得

今年是第二次參加 SITCON 了,去年參加的很開心,所以今年也有在致力推薦學弟妹參加(都是學弟妹,嘆)。

當然,首要感謝的是毛毛,這三天兩夜都住在他家,然後我也順便把他拖來參加 SITCON 了,在他家裡的時候,就看他用電腦,然後我和他就東聊西聊,真的有 Pair Programng 的感覺。然後在 SITCON 當天他也整天陪我到處聽議程,有人可以在旁邊亂哈啦的感覺超棒,聊得很開心,也謝謝毛毛的招待啦,哈。

這次 SITCON,想到了去年 SyncArt 有投稿上台當講師,在加上若虛大大的慫恿,於是就想說找個主題投,原本沒抱很大期待,沒想到被議程組有幸選中,其實心中頗開心,但是壓力也頗大。

首先,因為我原本投稿 40min 的長度,結果因為其他大大太強了,只剩下 10min 的機會,我想說 10min 就挑戰看看,所以就答應了。這下就開始困擾,因為我在準備的時候,根本就是依照 40min 在準備,於是只好砍掉正規表示式的教學部份,把重心放在介紹網路資源上面,因為我覺的,真的高手都早就已經會用正規表示式了,所以這場是要講給沒聽過,或者是還沒仔細學過的朋友,在這麼短的時間下,給魚還不如給熊掌。

再來,議程出來後,就注意到我的上一場是 Jserv,整個壓力超大的阿,因為我知道我根本不是搞笑的料。很多大大都能夠把枯燥乏味的東西加入很多笑點,但是我這方面頗弱,所以我的投影片準備的非常正經,但是又擔心大家覺的我講的不夠好XD

還有一點,是演講當天才發現的,就是我發現我的演講居然是在點心前面的最後一場,大家想吃點心我也想吃阿(X


鄭永斌教授的那場演講,因為心中有所遺憾,所以這場聽起來也頗感心酸,畢竟是自己搞烏龍,導致沒被錄取,又能怪誰呢?

陳鐘誠教授那場,我沒敢站起來,我超級俗阿的,糗。(萬人響應,沒人起立)老實說,提到這個老師,我就真的會聯想到洪朝貴老師耶,不知道有沒有機會以後請到他,哈。應該也可以引起不少人的共鳴的。

「從網路到電路 - 利用 HTTP 的 RESTful 設計,控制牆壁上的插座」
這場我到視覺得很可惜,因為要自己 DIY 的話,就真的只能夠 On/Off,除非家電真的都有到提供 API 的地步阿。感覺他也是功力高強阿,而且我覺的他們的介面好漂亮,然後還有拍出漂漂亮亮的影片,好的包裝就先贏一半了(咦?

借下來 Andy 的開放式課程,因為投影片咻咻咻的就飛過了,好像沒啥感覺XD (其實是上台前太緊張 抱歉啦 哈

Jserv 這場,由於我在上台前,非常努力的想讓自己不要那麼緊張,所以也沒趕仔細聽,糗。

接下來去聽蒼時的「如何維護你的專案」,說真的,有大部份是我聽過的,但是像 Github 的那段趣談,就讓我很開心,因為我還沒有真的踏入貢獻 Open Source,而且說真的,一直都不知道從和入手,有他的經驗分享,真的頗開心。希望哪天,也可以對這世界做出點貢獻吧。除此之外,又聽到一個新的東西「https://travis-ci.org/

接下來就繼續聽「從技術面簡介線上遊戲外掛」,聽了很多與保護程式的對抗,聽完之後還是覺的,我不是寫外掛的料啊,因為這根本就是超深的坑阿,跳進去就會跳不出來了,我現在要學的東西已經太多了,真的在學這個東西,就會讓我什麼都學不好了...

待研究關鍵字

travis ci, haml, sass, less, laravel, EC2

[PHP] array add and merge behave

| Comments

Purpose

Compare between array add array()+array() and array_merge() in PHP.

Code:

$arr = array(
    'a' => 1,
    'b' => 1,
    0 => 1,
) + array(
    'a' => 2,
    'c' => 2,
    0 => 2,
);
var_export($arr);
$arr = array_merge( array(
    'a' => 1,
    'b' => 1,
    0 => 1,
) , array(
    'a' => 2,
    'c' => 2,
    0 => 2,
));
var_export($arr);

Result:

array (
  'a' => 1,
  'b' => 1,
  0 => 1,
  'c' => 2,
)
array (
  'a' => 2,
  'b' => 1,
  0 => 1,
  'c' => 2,
  1 => 2,
)

GDB 指令紀錄

| Comments

老師給予一個測試程式:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char * arg[]){
    int a, b, c, d, e, f, i;
    a = 0;
    b = 8;
    c = 29;
    d = 44;
    e = 444;
    
    printf("%d %d %d %d %d", a, b, c, d, e);
    
    for (i=0; i<argc; i++) printf("@@ %s \n", arg[i]);
   system("pause");
    return 0;
}

指令紀錄

  • 編譯指令:$ gcc -g -o test1.exe test.c
  • 進入 GDB:$ gdb or $ gdb test1.exe
  • 讀取執行檔: file test1.exe
  • 設定執行參數: show args, set args arg1 arg2 arg3
  • 執行:run
  • 顯示10行程式碼:list
  • 設定中斷點於第八行:b 8
  • 顯示中斷點清單:info break
  • 印出即時的變數:print a,a 是變數名稱
  • 持續追蹤變數:display a,a 是變數名稱
  • 取消追蹤變數:undisplay 1,後面第二個參數要接數字,必須是 display list 的數字

[CPE培訓] 2014-02-25

| Comments

CPE 考試

  • 報名期間:2014/03/11 (二) 14:25 ~ 2014/03/21 (五) 18:00
  • 考試時間:2014/03/25 (二)
    • 17:30-17:40 報到, 18:00 之後不得入場
    • 17:40-18:30 練習
    • 18:40-21:40 考試
  • 網址:http://cpe.cse.nsysu.edu.tw/newest.php

今日練習題目

http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6714

加速 input / output 技巧

  • 使用 scanf, printf
  • 使用 sync_with_stdio(false);
int main()
{
    // 需注意這樣會有 scanf, printf 和 cin, cout 不同步的副作用
    cin.sync_with_stdio(false);
    cout.sync_with_stdio(false);
}

浮點數精確度處理

int dzero( double da )
{
    const double delta = 1e-8;
    return ( da < -delta ) ? -1 : ( da > delta );
}