Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.034USD
STEEM
0.002STEEM
SBD
0.055SBD
Effective Power
5.007SP
├── Own SP
0.126SP
└── Incoming Deleg
+4.882SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.002STEEM
STEEM POWER
Own SP
0.126SP
Delegated Out
0.000SP
Delegation In
4.882SP
Effective Power
5.007SP
Reward SP (pending)
0.033SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.055SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.002 STEEM",
  "vesting_shares": "204.173876 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7939.485930 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.055 SBD",
  "conversions": []
}

Account Info

namefeliperce
id844447
rank1,226,225
reputation913098146
created2018-03-13T02:47:06
recovery_accountsteem
proxyNone
post_count4
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-07-01T22:24:48
last_root_post2018-07-01T22:24:48
last_vote_time2018-07-07T05:01:42
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares204.173876 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7939.485930 VESTS
reward_vesting_balance67.352830 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-03-13T03:12:42
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 844447,
  "name": "feliperce",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7ZMhVdxq78Zm5UwKs8nJouwyRb8EwVVmRc8JZ75RhJrs9SbJba",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5wPkvF9KFA8g3tuMHQyMgw3KLBmr3qgnFtNYN5A5dVmtDp2YsV",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6mPR55y6EmuTqfDXAxLx5bekPzL8GsVVzfN2JYxKYFycZE8bT9",
        1
      ]
    ]
  },
  "memo_key": "STM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://i.imgur.com/d0esKHj.png\",\"name\":\"Felipe Rodrigues\",\"location\":\"São Paulo - SP, Brazil\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://i.imgur.com/d0esKHj.png\",\"name\":\"Felipe Rodrigues\",\"location\":\"São Paulo - SP, Brazil\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2018-03-13T03:12:42",
  "created": "2018-03-13T02:47:06",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 4,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779063360
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779063360
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.055 SBD",
  "reward_steem_balance": "0.002 STEEM",
  "reward_vesting_balance": "67.352830 VESTS",
  "reward_vesting_steem": "0.033 STEEM",
  "vesting_shares": "204.173876 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7939.485930 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 65,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-07-01T22:24:48",
  "last_root_post": "2018-07-01T22:24:48",
  "last_vote_time": "2018-07-07T05:01:42",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 913098146,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 1226225
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.882 SP to @feliperce
2026/05/18 00:16:00
delegatorsteem
delegateefeliperce
vesting shares7939.485930 VESTS
Transaction InfoBlock #106143466/Trx 865577a25dd02a204c7aeab654293d15c4b3861c
View Raw JSON Data
{
  "trx_id": "865577a25dd02a204c7aeab654293d15c4b3861c",
  "block": 106143466,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-18T00:16:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "7939.485930 VESTS"
    }
  ]
}
steemdelegated 3.214 SP to @feliperce
2026/05/12 03:54:09
delegatorsteem
delegateefeliperce
vesting shares5227.275525 VESTS
Transaction InfoBlock #105975785/Trx 3d017c944836a0b98ab042753d1e6a748894daea
View Raw JSON Data
{
  "trx_id": "3d017c944836a0b98ab042753d1e6a748894daea",
  "block": 105975785,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-12T03:54:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "5227.275525 VESTS"
    }
  ]
}
steemdelegated 4.890 SP to @feliperce
2026/04/25 23:36:54
delegatorsteem
delegateefeliperce
vesting shares7952.001686 VESTS
Transaction InfoBlock #105511116/Trx fe1e37b9ca2a09b96cba7ff52fd647f697ba2cfe
View Raw JSON Data
{
  "trx_id": "fe1e37b9ca2a09b96cba7ff52fd647f697ba2cfe",
  "block": 105511116,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-25T23:36:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "7952.001686 VESTS"
    }
  ]
}
steemdelegated 3.240 SP to @feliperce
2026/01/23 07:50:21
delegatorsteem
delegateefeliperce
vesting shares5268.822344 VESTS
Transaction InfoBlock #102851854/Trx 2483f04e79679e8af1a3d19d858f68af6e7bdd81
View Raw JSON Data
{
  "trx_id": "2483f04e79679e8af1a3d19d858f68af6e7bdd81",
  "block": 102851854,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T07:50:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "5268.822344 VESTS"
    }
  ]
}
steemdelegated 3.341 SP to @feliperce
2024/12/17 03:09:30
delegatorsteem
delegateefeliperce
vesting shares5433.041541 VESTS
Transaction InfoBlock #91298264/Trx fadfac37f06b9de721d0cdc9a1678328433f49a2
View Raw JSON Data
{
  "trx_id": "fadfac37f06b9de721d0cdc9a1678328433f49a2",
  "block": 91298264,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T03:09:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "5433.041541 VESTS"
    }
  ]
}
steemdelegated 3.445 SP to @feliperce
2023/11/13 18:52:12
delegatorsteem
delegateefeliperce
vesting shares5602.175073 VESTS
Transaction InfoBlock #79852463/Trx f82db4622147301c43692c82731a5c05a501696c
View Raw JSON Data
{
  "trx_id": "f82db4622147301c43692c82731a5c05a501696c",
  "block": 79852463,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-13T18:52:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "5602.175073 VESTS"
    }
  ]
}
steemdelegated 5.251 SP to @feliperce
2023/09/21 21:50:39
delegatorsteem
delegateefeliperce
vesting shares8539.453859 VESTS
Transaction InfoBlock #78347844/Trx 788c7db6611ebea890aecb750e08f61233700fc7
View Raw JSON Data
{
  "trx_id": "788c7db6611ebea890aecb750e08f61233700fc7",
  "block": 78347844,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-21T21:50:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "8539.453859 VESTS"
    }
  ]
}
steemdelegated 5.387 SP to @feliperce
2022/11/03 11:38:21
delegatorsteem
delegateefeliperce
vesting shares8761.135297 VESTS
Transaction InfoBlock #69113183/Trx bdb4a72beb16903cdc0d030b1fbf21c06f85e962
View Raw JSON Data
{
  "trx_id": "bdb4a72beb16903cdc0d030b1fbf21c06f85e962",
  "block": 69113183,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T11:38:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "8761.135297 VESTS"
    }
  ]
}
steemdelegated 5.523 SP to @feliperce
2022/01/17 10:54:36
delegatorsteem
delegateefeliperce
vesting shares8981.668528 VESTS
Transaction InfoBlock #60809356/Trx 8cda680750a6afa6d9e46707b46f562938ceede6
View Raw JSON Data
{
  "trx_id": "8cda680750a6afa6d9e46707b46f562938ceede6",
  "block": 60809356,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T10:54:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "8981.668528 VESTS"
    }
  ]
}
steemdelegated 5.636 SP to @feliperce
2021/06/14 00:49:54
delegatorsteem
delegateefeliperce
vesting shares9165.437186 VESTS
Transaction InfoBlock #54607745/Trx 9c6a0803b0c92afa7c6497d11df3bcbf0b1fffdd
View Raw JSON Data
{
  "trx_id": "9c6a0803b0c92afa7c6497d11df3bcbf0b1fffdd",
  "block": 54607745,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T00:49:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9165.437186 VESTS"
    }
  ]
}
steemdelegated 5.751 SP to @feliperce
2020/12/11 11:08:30
delegatorsteem
delegateefeliperce
vesting shares9352.859160 VESTS
Transaction InfoBlock #49355199/Trx 86f2d84da20e6258d3793de87fff98013acdd9c2
View Raw JSON Data
{
  "trx_id": "86f2d84da20e6258d3793de87fff98013acdd9c2",
  "block": 49355199,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T11:08:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9352.859160 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @feliperce
2020/12/06 04:45:51
delegatorsteem
delegateefeliperce
vesting shares1912.543513 VESTS
Transaction InfoBlock #49206766/Trx b3c147b236fb3ec473a812065fed3f598a2f24c5
View Raw JSON Data
{
  "trx_id": "b3c147b236fb3ec473a812065fed3f598a2f24c5",
  "block": 49206766,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T04:45:51",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.755 SP to @feliperce
2020/12/05 14:46:42
delegatorsteem
delegateefeliperce
vesting shares9359.067014 VESTS
Transaction InfoBlock #49190296/Trx f9223d8db21aa1d699fe10e1787f16fc6a6d5a58
View Raw JSON Data
{
  "trx_id": "f9223d8db21aa1d699fe10e1787f16fc6a6d5a58",
  "block": 49190296,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T14:46:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9359.067014 VESTS"
    }
  ]
}
steemdelegated 1.181 SP to @feliperce
2020/11/02 15:40:57
delegatorsteem
delegateefeliperce
vesting shares1920.017158 VESTS
Transaction InfoBlock #48257852/Trx 178dc5b43aa4ab3878b620f0b167ae19a714754d
View Raw JSON Data
{
  "trx_id": "178dc5b43aa4ab3878b620f0b167ae19a714754d",
  "block": 48257852,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-02T15:40:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.880 SP to @feliperce
2020/05/09 05:43:06
delegatorsteem
delegateefeliperce
vesting shares9561.872373 VESTS
Transaction InfoBlock #43217012/Trx a31133f90eb2d5d0de4fc2cf9bc4a150f11307d7
View Raw JSON Data
{
  "trx_id": "a31133f90eb2d5d0de4fc2cf9bc4a150f11307d7",
  "block": 43217012,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T05:43:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9561.872373 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @feliperce
2020/05/08 09:19:21
delegatorsteem
delegateefeliperce
vesting shares1953.311140 VESTS
Transaction InfoBlock #43193110/Trx 7064f15f4710f2108ce0801e83d30ea0782bdf80
View Raw JSON Data
{
  "trx_id": "7064f15f4710f2108ce0801e83d30ea0782bdf80",
  "block": 43193110,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T09:19:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
2020/03/13 03:47:48
parent authorfeliperce
parent permlinkprogramando-em-kotlin-para-javascript
authorsteemitboard
permlinksteemitboard-notify-feliperce-20200313t034748000z
title
bodyCongratulations @feliperce! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@feliperce/birthday2.png</td><td>Happy Steem Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@feliperce) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=feliperce)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/downvote-challenge-add-up-to-3-funny-badges-to-your-board"><img src="https://steemitimages.com/64x128/https://steemitimages.com/0x0/![](https://cdn.steemitimages.com/DQmUuJkZdnSpHVWssxF82ntymqXg4Pvk6K6bYvckUYVRsnj/image.png)"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/downvote-challenge-add-up-to-3-funny-badges-to-your-board">Downvote challenge - Add up to 3 funny badges to your board</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #41605260/Trx 5d9c162bc21a6d5c58cc483a7f5e68a4db1b1e50
View Raw JSON Data
{
  "trx_id": "5d9c162bc21a6d5c58cc483a7f5e68a4db1b1e50",
  "block": 41605260,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-03-13T03:47:48",
  "op": [
    "comment",
    {
      "parent_author": "feliperce",
      "parent_permlink": "programando-em-kotlin-para-javascript",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-feliperce-20200313t034748000z",
      "title": "",
      "body": "Congratulations @feliperce! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@feliperce/birthday2.png</td><td>Happy Steem Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@feliperce) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=feliperce)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/downvote-challenge-add-up-to-3-funny-badges-to-your-board\"><img src=\"https://steemitimages.com/64x128/https://steemitimages.com/0x0/![](https://cdn.steemitimages.com/DQmUuJkZdnSpHVWssxF82ntymqXg4Pvk6K6bYvckUYVRsnj/image.png)\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/downvote-challenge-add-up-to-3-funny-badges-to-your-board\">Downvote challenge - Add up to 3 funny badges to your board</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.945 SP to @feliperce
2019/11/01 07:38:15
delegatorsteem
delegateefeliperce
vesting shares9668.271456 VESTS
Transaction InfoBlock #37787947/Trx 3e80f6454e842f9171ce095427855338064e5e3f
View Raw JSON Data
{
  "trx_id": "3e80f6454e842f9171ce095427855338064e5e3f",
  "block": 37787947,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-11-01T07:38:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9668.271456 VESTS"
    }
  ]
}
2019/03/13 13:56:03
parent authorfeliperce
parent permlinkprogramando-em-kotlin-para-javascript
authorsteemitboard
permlinksteemitboard-notify-feliperce-20190313t135603000z
title
bodyCongratulations @feliperce! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@feliperce/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@feliperce) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=feliperce)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmYGN7R653u4hDFyq1hM7iuhr2bdAP1v2ApACDNtecJAZ5/image.png"></a></td><td><a href="https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter">Are you a DrugWars early adopter? Benvenuto in famiglia!</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #31118945/Trx cfaee059d445a046d960a7c7d7d9d26992643c44
View Raw JSON Data
{
  "trx_id": "cfaee059d445a046d960a7c7d7d9d26992643c44",
  "block": 31118945,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-03-13T13:56:03",
  "op": [
    "comment",
    {
      "parent_author": "feliperce",
      "parent_permlink": "programando-em-kotlin-para-javascript",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-feliperce-20190313t135603000z",
      "title": "",
      "body": "Congratulations @feliperce! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@feliperce/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@feliperce) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=feliperce)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmYGN7R653u4hDFyq1hM7iuhr2bdAP1v2ApACDNtecJAZ5/image.png\"></a></td><td><a href=\"https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter\">Are you a DrugWars early adopter? Benvenuto in famiglia!</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 6.066 SP to @feliperce
2018/11/26 17:29:54
delegatorsteem
delegateefeliperce
vesting shares9865.746833 VESTS
Transaction InfoBlock #28043939/Trx 580c41034a330263c6f667019d14185d899b7f49
View Raw JSON Data
{
  "trx_id": "580c41034a330263c6f667019d14185d899b7f49",
  "block": 28043939,
  "trx_in_block": 34,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-26T17:29:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9865.746833 VESTS"
    }
  ]
}
steemdelegated 18.489 SP to @feliperce
2018/10/19 06:37:09
delegatorsteem
delegateefeliperce
vesting shares30068.530437 VESTS
Transaction InfoBlock #26937234/Trx 31db003ac210208a665a0ee5a93bae77fbaad7aa
View Raw JSON Data
{
  "trx_id": "31db003ac210208a665a0ee5a93bae77fbaad7aa",
  "block": 26937234,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-19T06:37:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "30068.530437 VESTS"
    }
  ]
}
2018/10/19 05:54:36
required auths[]
required posting auths["feliperce"]
idfollow
json["follow",{"follower":"feliperce","following":"sweetsssj","what":["blog"]}]
Transaction InfoBlock #26936386/Trx 95e80b006adb55e309f6dc1eb5f60dfbf9407100
View Raw JSON Data
{
  "trx_id": "95e80b006adb55e309f6dc1eb5f60dfbf9407100",
  "block": 26936386,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-19T05:54:36",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "feliperce"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"feliperce\",\"following\":\"sweetsssj\",\"what\":[\"blog\"]}]"
    }
  ]
}
steemdelegated 6.081 SP to @feliperce
2018/10/15 12:17:18
delegatorsteem
delegateefeliperce
vesting shares9888.773529 VESTS
Transaction InfoBlock #26828936/Trx 947313a9dcd274919eb7287989777e2e4d007b8b
View Raw JSON Data
{
  "trx_id": "947313a9dcd274919eb7287989777e2e4d007b8b",
  "block": 26828936,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-15T12:17:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9888.773529 VESTS"
    }
  ]
}
2018/07/16 12:04:00
required auths[]
required posting auths["feliperce"]
idfollow
json["follow",{"follower":"feliperce","following":"fastresteem","what":[]}]
Transaction InfoBlock #24225504/Trx c1f040bbc5878463df65ffc30ff5264d985e3aa5
View Raw JSON Data
{
  "trx_id": "c1f040bbc5878463df65ffc30ff5264d985e3aa5",
  "block": 24225504,
  "trx_in_block": 33,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-16T12:04:00",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "feliperce"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"feliperce\",\"following\":\"fastresteem\",\"what\":[]}]"
    }
  ]
}
2018/07/07 05:01:42
voterfeliperce
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight10000 (100.00%)
Transaction InfoBlock #23957938/Trx 91f4ef4367504f34736f3636ea8a665e0218a147
View Raw JSON Data
{
  "trx_id": "91f4ef4367504f34736f3636ea8a665e0218a147",
  "block": 23957938,
  "trx_in_block": 39,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T05:01:42",
  "op": [
    "vote",
    {
      "voter": "feliperce",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 10000
    }
  ]
}
2018/07/02 08:34:36
parent authorfeliperce
parent permlinkprogramando-em-kotlin-para-javascript
authorsteemitboard
permlinksteemitboard-notify-feliperce-20180702t083438000z
title
bodyCongratulations @feliperce! You have completed the following achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@feliperce) Award for the number of upvotes received <sub>_Click on the badge to view your Board of Honor._</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> **Do not miss the last post from @steemitboard:** [SteemitBoard World Cup Contest - Belgium vs Japan](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-belgium-vs-japan) --- **Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!** Collect World Cup badges and win free SBD Support the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1) --- > Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #23828107/Trx 9a0965734f71daf863adfb9f97f0e89b50fd3db3
View Raw JSON Data
{
  "trx_id": "9a0965734f71daf863adfb9f97f0e89b50fd3db3",
  "block": 23828107,
  "trx_in_block": 87,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-02T08:34:36",
  "op": [
    "comment",
    {
      "parent_author": "feliperce",
      "parent_permlink": "programando-em-kotlin-para-javascript",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-feliperce-20180702t083438000z",
      "title": "",
      "body": "Congratulations @feliperce! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :\n\n[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@feliperce) Award for the number of upvotes received\n\n<sub>_Click on the badge to view your Board of Honor._</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n**Do not miss the last post from @steemitboard:**\n[SteemitBoard World Cup Contest - Belgium vs Japan](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-belgium-vs-japan)\n\n---\n**Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!**\nCollect World Cup badges and win free SBD\nSupport the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1)\n\n---\n\n> Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
2018/07/02 06:32:24
parent author
parent permlinkkotlin
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
titleProgramando em Kotlin para JavaScript
body![kotlin.png](https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png) Este artigo é para demonstrar como compilar código Kotlin em Javascript, utilizando um projeto simples. ## O que é Kotlin [Kotlin](https://kotlinlang.org/) é uma linguagem de programação desenvolvida pela JetBrains, criada para ter total interoperabilidade com a linguagem Java. Pode ser compilada para a JVM, código nativo, Android e traduzida para Javascript. Kotlin foi criado em 2011, porém, somente teve uma adoção massiva após o Google I/O 2017 onde foi anunciado o suporte oficial da linguagem no [desenvolvimento Android](https://developer.android.com/kotlin/) ## Criando o primeiro projeto Kotlin para Javascript Este artigo é destinado para quem já tem um conhecimento em Kotlin, por isto não exemplificarei sobre suas funções e sintaxe... Porém, há vários artigos, documentações e é até possível testar em uma [ferramenta oficial online](http://try.kotlinlang.org/), recomendo! É recomendado que se crie o projeto com Gradle (facilitará muito na hora de gerenciar dependências), porém para este exemplo utilizarei o próprio wizard da IntelliJ, para facilitar a demonstração. * Primeiro, crie um novo projeto em Kotlin > Kotlin/JS: <center>![New Project_005.png](https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png)</center> Observe que uma lib foi adicionada. <center>![lib](https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png)</center> * Agora crie um arquivo html com nome "index" <center>![index](https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png)</center> * Adicione duas tags script no index.html: ```javascript <script type="text/javascript" src="out/production/(SeuProjeto)/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/(SeuProjeto)/(SeuMódulo).js"></script> ``` </br> * Substitua "(SeuProjeto)" pelo nome do seu projeto e "(SeuMódulo)" pelo nome do módulo, ficando assim: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Kotlin to JavaScript!</title> </head> <body> <script type="text/javascript" src="out/production/KotlinToJavaScript/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/KotlinToJavaScript/KotlinToJavaScript.js"></script> </body> </html> ``` </br> Mantenha o kotlin.js sempre em primeiro, pois ele será utilizado pela aplicação. * Crie um arquivo .kt contendo uma função Main: ```Kotlin fun main(args: Array<String>) { println("WOOOOOOOOOW!!!!") } ``` </br> * Compile o projeto <center>![build](https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png)</center> O arquivo .js especificado no index.html será gerado na pasta out/ <center>![js gerado](https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png)</center> * Agora rode o index.html em algum navegador (dica: acesse o index.html e aparecerá uma opção para selecionar o navegador, ou configure o compilador para rodar o index diretamente), em seguida verifique o Javascript console: <center>![index.html](https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png)</center> </br> <center>![Seleção_008.png](https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png)</center> </br> Pronto, seu primeiro HelloWorld! ## Melhorando o projeto HelloWorld pronto, agora adicionemos algumas funcionalidades interessantes! * Adicione dois inputs no index.html: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Kotlin to Html!</title> </head> <body> Que nota você daria para o Kotlin? (0-10) </br> <input type="text" id="note"> <input type="submit" id="submit" value="Enviar"> <script type="text/javascript" src="out/production/KotlinToJavaScript/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/KotlinToJavaScript/KotlinToJavaScript.js"></script> </body> </html> ``` </br> * No arquivo Kotlin, adicione dois imports ```kotlin import kotlin.browser.* import org.w3c.dom.* ``` </br> Com os imports será possível utilizar algumas funções do JavaScript no Kotlin. * Na função Main, adicione uma referência do input em uma variável button, depois adicione um listener de clique: ```kotlin val button = document.getElementById("submit") as HTMLInputElement button.addEventListener("click", { window.alert("Um alert, eita!!!") }) ``` </br> * O import implementado no início te possibilita usar recursos do javascript, como o `document.getElementById` e `window.alert`. Compile o projeto, rode novamente no navegador e clique no botão: <center>![js alert](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center> </br> Woooow, agora temos um alert! <center>https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif</center> Não pare por aí, ainda falta algumas implementações! * Retorne ao arquivo Kotlin e implemente uma função chamada "evaluate" que passa um `Int` como parâmetro e retorna uma `String`, o retorno desta função será a mensagem do `alert`. ```kotlin fun evaluate(value: Int): String { return when (value) { in 0..3 -> "Que absurdo!" in 4..6 -> "Invejoso!!!" in 7..10 -> "s2 Kotlin é amor s2" else -> "Informe somente número de 0 a 10, der." } } ``` </br> * Então chame a função no `alert`, note que o parâmetro passado é um `Int`, temos que converter a `String` para `Int`. ```kotlin button.addEventListener("click", { window.alert(evaluate(text.value.toInt())) }) ``` </br> * Rode a aplicação e confira! <center>![Seleção_009.png](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center> </br> Observe que caso não seja informado um número, o `alert` não será chamado, isto porque na validação do `Int` não estamos verificando palavras, hora de corrigir isto! * Altere a função para que seja verificada que foi passado um número, utilizando a função `toIntOrNull()` da `String`, caso a `String` não possa ser convertida para `Int` (ou seja, não é um número), então será retornado null para a variável podendo realizar uma condição. ```kotlin import kotlin.browser.* import org.w3c.dom.* fun main(args: Array<String>) { val button = document.getElementById("submit") as HTMLInputElement val text = document.getElementById("note") as HTMLInputElement button.addEventListener("click", { window.alert(evaluate(text.value)) }) } fun evaluate(value: String): String { val number: Int? = value.toIntOrNull() return if(number != null) { when (number) { in 0..3 -> "Que absurdo!" in 4..6 -> "Invejoso!!!" in 7..10 -> "s2 Kotlin é amor s2" else -> "Informe somente número de 0 a 10, der." } } else { "Informe apenas números!!" } } ``` <center>![numeros](https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png)</center> Há formas melhores para verificar se são números ou não, como o [regex](https://www.programiz.com/kotlin-programming/examples/check-string-numeric) por exemplo, fique à vontade para testar! ## Lidando com arrays Uma das coisas mais interessantes do Kotlin são as [Data Classes](https://kotlinlang.org/docs/reference/data-classes.html), podemos criar POJOs de maneira mais legível, simples e sem bolilerplate, ao contrário da maneira tradicional do Java, então iniciemos uma nova implementação com ela. * Crie uma `Data Class` com nome TopIde e dois atributos ```kotlin data class TopIde( var rank: Int, var name: String ) ``` </br> * Inicialize um array do objeto TopIde com as seguintes informações: ```kotlin private var rankArrayList: ArrayList<TopIde> = arrayListOf( TopIde(1, "Visual Studio"), TopIde(2, "Eclipse"), TopIde(3, "Android Studio"), TopIde(4, "Netbeans"), TopIde(5, "IntelliJ"), TopIde(6, "Sublime Text"), TopIde(7, "Atom"), TopIde(8, "pyCharm") ) ``` </br> Estes valores representam um [rank das IDEs mais pesquisadas](http://pypl.github.io/IDE.html) no Google, pode ser que enquanto esteja lendo este artigo o rank tenha mudado! * Adicione um `foreach` do array na função `Main` que mostre seus valores. ```kotlin rankArrayList.forEach { val h = document.createElement("p") val t = document.createTextNode("${it.rank} - ${it.name}") h.appendChild(t) document.body?.appendChild(h) } ``` <center>![Seleção_020.png](https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png)</center> ## Debugando a aplicação Uma das vantagens de se utilizar Kotlin para JavaScript é o Intellij IDEA, a IDE mais completa do mercado (não é obrigatório, porém, é uma IDE recomendada, já que tem total integração com Kotlin), é possível até usar recursos como o `debug`. Há alguns passos iniciais para poder utilizar o debug: 1. Instale a extensão no [Chrome!](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en) 2. Nas preferências de compilação do Intellij, marque a opção `Generate source maps`: ![Settings_018.png](https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png) Agora é possível debugar o código Kotlin utilizando o debug padrão da IDE! ## Conclusão Kotlin seria uma boa alternativa para quem prefere uma linguagem mais produtiva e estaticamente tipada, com Kotlin você terá todas possibilidades da programação em Kotlin (linguagem estaticamente tipada, funcional, erros sendo mostrados em tempo de compilação, debug com Intellij, etc.), além de estar em constante crescimento. Para quem é programador Android, se sentirá mais confortável em programar para a Web (recomendo o [ktor](http://ktor.io/) para backend) Além de ter a possibilidade de programar em Kotlin para JavaScript puro, também poderá programar para os principais frameworks JavaScript do mercado, como o [React](https://github.com/JetBrains/create-react-kotlin-app) e [Node.js](https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7) e também poderá utilizar [DSL](https://github.com/Kotlin/kotlinx.html) para criar layouts dinâmicos. Fora do JavaScript, Kotlin tem total interoperabilidade com o Java, conseguindo integrar qualquer biblioteca incluindo os principais frameworks Java, como o [Spring](https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0) Baixe o projeto de exemplo no Github: https://github.com/feliperce/KotlinToJavaScript
json metadata{"tags":["kotlin","javascript","kotlin-javascript","html","portugues"],"image":["https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png","https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png","https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png","https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png","https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png","https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png","https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png","https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png","https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png","https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif","https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png","https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png","https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png"],"links":["https://kotlinlang.org/","https://developer.android.com/kotlin/","http://try.kotlinlang.org/","https://www.programiz.com/kotlin-programming/examples/check-string-numeric","https://kotlinlang.org/docs/reference/data-classes.html","http://pypl.github.io/IDE.html","https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en","http://ktor.io/","https://github.com/JetBrains/create-react-kotlin-app","https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7","https://github.com/Kotlin/kotlinx.html","https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0","https://github.com/feliperce/KotlinToJavaScript"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23825664/Trx 1bde466aeed4c0f306f170cca283fc2f96248c7d
View Raw JSON Data
{
  "trx_id": "1bde466aeed4c0f306f170cca283fc2f96248c7d",
  "block": 23825664,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-02T06:32:24",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kotlin",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "title": "Programando em Kotlin para JavaScript",
      "body": "![kotlin.png](https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png)\nEste artigo é para demonstrar como compilar código Kotlin em Javascript, utilizando um projeto simples.\n\n## O que é Kotlin\n\n[Kotlin](https://kotlinlang.org/) é uma linguagem de programação desenvolvida pela JetBrains, criada para ter total interoperabilidade com a linguagem Java. Pode ser compilada para a JVM, código nativo, Android e traduzida para Javascript.\n\nKotlin foi criado em 2011, porém, somente teve uma adoção massiva após o Google I/O 2017 onde foi anunciado o suporte oficial  da linguagem no [desenvolvimento Android](https://developer.android.com/kotlin/)\n\n## Criando o primeiro projeto Kotlin para Javascript\n\nEste artigo é destinado para quem já tem um conhecimento em Kotlin, por isto não exemplificarei sobre suas funções e sintaxe... Porém, há vários artigos, documentações e é até possível testar em uma [ferramenta oficial online](http://try.kotlinlang.org/), recomendo!\n\nÉ recomendado que se crie o projeto com Gradle (facilitará muito na hora de gerenciar dependências), porém para este exemplo utilizarei o próprio wizard da IntelliJ, para facilitar a demonstração.\n\n* Primeiro, crie um novo projeto em Kotlin > Kotlin/JS:\n\n<center>![New Project_005.png](https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png)</center>\n\nObserve que uma lib foi adicionada.\n\n<center>![lib](https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png)</center>\n\n* Agora crie um arquivo html com nome \"index\" \n\n<center>![index](https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png)</center>\n\n* Adicione duas tags script no index.html:\n\n```javascript\n<script type=\"text/javascript\" src=\"out/production/(SeuProjeto)/lib/kotlin.js\"></script>\n<script type=\"text/javascript\" src=\"out/production/(SeuProjeto)/(SeuMódulo).js\"></script>\n```\n</br>\n* Substitua \"(SeuProjeto)\" pelo nome do seu projeto e \"(SeuMódulo)\" pelo nome do módulo, ficando assim:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Kotlin to JavaScript!</title>\n</head>\n    <body>\n\n    <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/lib/kotlin.js\"></script>\n    <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/KotlinToJavaScript.js\"></script>\n    </body>\n</html>\n```\n</br>\nMantenha o kotlin.js sempre em primeiro, pois ele será utilizado pela aplicação.\n\n* Crie um arquivo .kt contendo uma função Main:\n\n```Kotlin\nfun main(args: Array<String>) {\n    println(\"WOOOOOOOOOW!!!!\")\n}\n```\n</br>\n* Compile o projeto\n\n<center>![build](https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png)</center>\n\nO arquivo .js especificado no index.html será gerado na pasta out/\n\n<center>![js gerado](https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png)</center>\n\n* Agora rode o index.html em algum navegador (dica: acesse o index.html e aparecerá uma opção para selecionar o navegador, ou configure o compilador para rodar o index diretamente), em seguida verifique o Javascript console:\n\n<center>![index.html](https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png)</center>\n</br>\n\n<center>![Seleção_008.png](https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png)</center>\n</br>\nPronto, seu primeiro HelloWorld!\n\n## Melhorando o projeto\n\nHelloWorld pronto, agora adicionemos algumas funcionalidades interessantes!\n* Adicione dois inputs no index.html:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Kotlin to Html!</title>\n</head>\n    <body>\n    \n        Que nota você daria para o Kotlin? (0-10) </br>\n        <input type=\"text\" id=\"note\">\n        <input type=\"submit\" id=\"submit\" value=\"Enviar\">\n        \n        <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/lib/kotlin.js\"></script>\n        <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/KotlinToJavaScript.js\"></script>\n    </body>\n</html>\n```\n</br>\n* No arquivo Kotlin, adicione dois imports\n\n```kotlin\nimport kotlin.browser.*\nimport org.w3c.dom.*\n```\n</br>\nCom os imports será possível utilizar algumas funções do JavaScript no Kotlin.\n* Na função Main, adicione uma referência do input em uma variável button, depois adicione um listener de clique:\n\n```kotlin\nval button = document.getElementById(\"submit\") as HTMLInputElement\n\n    button.addEventListener(\"click\", {\n        window.alert(\"Um alert, eita!!!\")\n    })\n```\n</br>\n* O import implementado no início te possibilita usar recursos do javascript, como o `document.getElementById` e `window.alert`. Compile o projeto, rode novamente no navegador e clique no botão:\n\n<center>![js alert](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center>\n</br>\n\nWoooow, agora temos um alert!\n\n<center>https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif</center>\n\nNão pare por aí, ainda falta algumas implementações!\n\n* Retorne ao arquivo Kotlin e implemente uma função chamada \"evaluate\" que passa um `Int` como parâmetro e retorna uma `String`, o retorno desta função será a mensagem do `alert`.\n\n```kotlin\nfun evaluate(value: Int): String {\n    return when (value) {\n        in 0..3 -> \"Que absurdo!\"\n        in 4..6 -> \"Invejoso!!!\"\n        in 7..10 -> \"s2 Kotlin é amor s2\"\n        else -> \"Informe somente número de 0 a 10, der.\"\n    }\n}\n```\n</br>\n* Então chame a função no `alert`, note que o parâmetro passado é um `Int`,  temos que converter a `String` para `Int`.\n\n```kotlin\nbutton.addEventListener(\"click\", {\n        window.alert(evaluate(text.value.toInt()))\n    })\n```\n</br>\n* Rode a aplicação e confira!\n\n<center>![Seleção_009.png](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center>\n</br>\nObserve que caso não seja informado um número, o `alert` não será chamado, isto porque na validação do `Int` não estamos verificando palavras, hora de corrigir isto!\n\n\n* Altere a função para que seja verificada que foi passado um número, utilizando a função `toIntOrNull()` da `String`, caso a `String` não possa ser convertida para `Int` (ou seja, não é um número),  então será retornado null para a variável podendo realizar uma condição.\n\n```kotlin\nimport kotlin.browser.*\nimport org.w3c.dom.*\n\nfun main(args: Array<String>) {\n\n    val button = document.getElementById(\"submit\") as HTMLInputElement\n    val text = document.getElementById(\"note\") as HTMLInputElement\n\n    button.addEventListener(\"click\", {\n        window.alert(evaluate(text.value))\n    })\n}\n\nfun evaluate(value: String): String {\n\n    val number: Int? = value.toIntOrNull()\n\n    return if(number != null) {\n        when (number) {\n            in 0..3 -> \"Que absurdo!\"\n            in 4..6 -> \"Invejoso!!!\"\n            in 7..10 -> \"s2 Kotlin é amor s2\"\n            else -> \"Informe somente número de 0 a 10, der.\"\n        }\n    } else {\n        \"Informe apenas números!!\"\n    }\n}\n```\n\n<center>![numeros](https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png)</center>\n\nHá formas melhores para verificar se são números ou não, como o [regex](https://www.programiz.com/kotlin-programming/examples/check-string-numeric) por exemplo, fique à vontade para testar!\n\n## Lidando com arrays\n\nUma das coisas mais interessantes do Kotlin são as [Data Classes](https://kotlinlang.org/docs/reference/data-classes.html), podemos criar POJOs de maneira mais legível, simples e sem bolilerplate, ao contrário da maneira tradicional do Java, então iniciemos uma nova implementação com ela.\n\n* Crie uma `Data Class` com nome TopIde e dois atributos\n\n```kotlin\ndata class TopIde(\n    var rank: Int,\n    var name: String\n)\n```\n</br>\n* Inicialize um array do objeto TopIde com as seguintes informações:\n\n```kotlin\nprivate var rankArrayList: ArrayList<TopIde> = arrayListOf(\n        TopIde(1, \"Visual Studio\"),\n        TopIde(2, \"Eclipse\"),\n        TopIde(3, \"Android Studio\"),\n        TopIde(4, \"Netbeans\"),\n        TopIde(5, \"IntelliJ\"),\n        TopIde(6, \"Sublime Text\"),\n        TopIde(7, \"Atom\"),\n        TopIde(8, \"pyCharm\")\n)\n```\n</br>\nEstes valores representam um [rank das IDEs mais pesquisadas](http://pypl.github.io/IDE.html) no Google, pode ser que enquanto esteja lendo este artigo o rank tenha mudado!\n\n* Adicione um `foreach` do array na função `Main` que mostre seus valores.\n\n```kotlin\nrankArrayList.forEach {\n        val h = document.createElement(\"p\")\n        val t = document.createTextNode(\"${it.rank} - ${it.name}\")\n        h.appendChild(t)\n        document.body?.appendChild(h)\n }\n```\n<center>![Seleção_020.png](https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png)</center>\n\n## Debugando a aplicação\n\nUma das vantagens de se utilizar Kotlin para JavaScript é o Intellij IDEA, a IDE mais completa do mercado (não é obrigatório, porém, é uma IDE recomendada, já que tem total integração com Kotlin), é possível até usar recursos como o `debug`.  Há alguns passos iniciais para poder utilizar o debug:\n\n1. Instale a extensão no [Chrome!](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en)\n\n2. Nas preferências de compilação do Intellij, marque a opção `Generate source maps`:\n\n![Settings_018.png](https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png)\n\nAgora é possível debugar o código Kotlin utilizando o debug padrão da IDE!\n\n## Conclusão\n\nKotlin seria uma boa alternativa para quem prefere uma linguagem mais produtiva e estaticamente tipada, com Kotlin você terá todas possibilidades da programação em Kotlin (linguagem estaticamente tipada, funcional, erros sendo mostrados em tempo de compilação, debug com Intellij, etc.), além de estar em constante crescimento. Para quem é programador Android, se sentirá mais confortável em programar para a Web (recomendo o [ktor](http://ktor.io/) para backend)\n\nAlém de ter a possibilidade de programar em Kotlin para JavaScript puro, também poderá programar para os principais frameworks JavaScript do mercado, como o [React](https://github.com/JetBrains/create-react-kotlin-app) e [Node.js](https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7) e também poderá utilizar [DSL](https://github.com/Kotlin/kotlinx.html) para criar layouts dinâmicos. Fora do JavaScript, Kotlin tem total interoperabilidade com o Java, conseguindo integrar qualquer biblioteca incluindo os principais frameworks Java, como o [Spring](https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0)\n\nBaixe o projeto de exemplo no Github: https://github.com/feliperce/KotlinToJavaScript",
      "json_metadata": "{\"tags\":[\"kotlin\",\"javascript\",\"kotlin-javascript\",\"html\",\"portugues\"],\"image\":[\"https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png\",\"https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png\",\"https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png\",\"https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png\",\"https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png\",\"https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png\",\"https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png\",\"https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png\",\"https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png\",\"https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif\",\"https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png\",\"https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png\",\"https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png\"],\"links\":[\"https://kotlinlang.org/\",\"https://developer.android.com/kotlin/\",\"http://try.kotlinlang.org/\",\"https://www.programiz.com/kotlin-programming/examples/check-string-numeric\",\"https://kotlinlang.org/docs/reference/data-classes.html\",\"http://pypl.github.io/IDE.html\",\"https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en\",\"http://ktor.io/\",\"https://github.com/JetBrains/create-react-kotlin-app\",\"https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7\",\"https://github.com/Kotlin/kotlinx.html\",\"https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0\",\"https://github.com/feliperce/KotlinToJavaScript\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemdelegated 18.597 SP to @feliperce
2018/07/02 00:03:54
delegatorsteem
delegateefeliperce
vesting shares30244.637467 VESTS
Transaction InfoBlock #23817894/Trx 9273bdaa7efd1ed8b79bf2324b0dac00af8b4a34
View Raw JSON Data
{
  "trx_id": "9273bdaa7efd1ed8b79bf2324b0dac00af8b4a34",
  "block": 23817894,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-02T00:03:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "30244.637467 VESTS"
    }
  ]
}
2018/07/01 23:48:48
required auths[]
required posting auths["feliperce"]
idfollow
json["follow",{"follower":"feliperce","following":"fastresteem","what":["blog"]}]
Transaction InfoBlock #23817592/Trx 4561f53231e3776066142dfef7e12d071272c75c
View Raw JSON Data
{
  "trx_id": "4561f53231e3776066142dfef7e12d071272c75c",
  "block": 23817592,
  "trx_in_block": 31,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T23:48:48",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "feliperce"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"feliperce\",\"following\":\"fastresteem\",\"what\":[\"blog\"]}]"
    }
  ]
}
2018/07/01 23:03:15
voteryehey
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight1000 (10.00%)
Transaction InfoBlock #23816681/Trx 6bfa93e005e115d746a93112895b751d0e324589
View Raw JSON Data
{
  "trx_id": "6bfa93e005e115d746a93112895b751d0e324589",
  "block": 23816681,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T23:03:15",
  "op": [
    "vote",
    {
      "voter": "yehey",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 1000
    }
  ]
}
2018/07/01 23:01:27
voteracknowledgement
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight1000 (10.00%)
Transaction InfoBlock #23816645/Trx 1266390e2f317a4412adb984b7e01009b94a0011
View Raw JSON Data
{
  "trx_id": "1266390e2f317a4412adb984b7e01009b94a0011",
  "block": 23816645,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T23:01:27",
  "op": [
    "vote",
    {
      "voter": "acknowledgement",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 1000
    }
  ]
}
2018/07/01 22:55:00
voteralphabot
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight100 (1.00%)
Transaction InfoBlock #23816516/Trx a0a9f6bbbcaed31ad13f6d8ac267a95b5a851aa8
View Raw JSON Data
{
  "trx_id": "a0a9f6bbbcaed31ad13f6d8ac267a95b5a851aa8",
  "block": 23816516,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:55:00",
  "op": [
    "vote",
    {
      "voter": "alphabot",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 100
    }
  ]
}
2018/07/01 22:54:48
parent author
parent permlinkkotlin
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
titleProgramando em Kotlin para JavaScript
body@@ -532,16 +532,13 @@ iva -quando n +ap%C3%B3s o Go @@ -551,16 +551,21 @@ /O 2017 +onde foi anun @@ -574,30 +574,28 @@ ado +o suport -ar +e oficial -mente + d a li @@ -1394,11 +1394,14 @@ r%3E%0A%0A -Not +Observ e qu @@ -3798,23 +3798,19 @@ ora -falta adicion -ar +emos alg @@ -4525,20 +4525,17 @@ br%3E%0ACom -este +o s import @@ -4540,17 +4540,21 @@ rts -poderemos +ser%C3%A1 poss%C3%ADvel uti @@ -4574,29 +4574,29 @@ fun%C3%A7%C3%B5es do -javas +JavaS cript no Kot @@ -7594,17 +7594,16 @@ o %5Bregex -! %5D(https: @@ -7790,22 +7790,22 @@ s%C3%A3o as %5B -d +D ata -c +C lasses%5D( @@ -7996,18 +7996,16 @@ iciemos -a uma nova @@ -10269,16 +10269,152 @@ cimento. + Para quem %C3%A9 programador Android, se sentir%C3%A1 mais confort%C3%A1vel em programar para a Web (recomendo o %5Bktor%5D(http://ktor.io/) para backend) %0A%0AAl%C3%A9m d @@ -10929,29 +10929,17 @@ eca -e com integra%C3%A7%C3%A3o para +incluindo os @@ -11073,33 +11073,34 @@ 0)%0A%0A -Este c%C3%B3digo est%C3%A1 presente +Baixe o projeto de exemplo no
json metadata{"tags":["kotlin","javascript","kotlin-javascript","html","jetbrains"],"image":["https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png","https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png","https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png","https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png","https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png","https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png","https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png","https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png","https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png","https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif","https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png","https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png","https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png"],"links":["https://kotlinlang.org/","https://developer.android.com/kotlin/","http://try.kotlinlang.org/","https://www.programiz.com/kotlin-programming/examples/check-string-numeric","https://kotlinlang.org/docs/reference/data-classes.html","http://pypl.github.io/IDE.html","https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en","http://ktor.io/","https://github.com/JetBrains/create-react-kotlin-app","https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7","https://github.com/Kotlin/kotlinx.html","https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0","https://github.com/feliperce/KotlinToJavaScript"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23816512/Trx 7f3b7e65fbd055b761e385fd263ae466a340ee60
View Raw JSON Data
{
  "trx_id": "7f3b7e65fbd055b761e385fd263ae466a340ee60",
  "block": 23816512,
  "trx_in_block": 44,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:54:48",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kotlin",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "title": "Programando em Kotlin para JavaScript",
      "body": "@@ -532,16 +532,13 @@\n iva \n-quando n\n+ap%C3%B3s \n o Go\n@@ -551,16 +551,21 @@\n /O 2017 \n+onde \n foi anun\n@@ -574,30 +574,28 @@\n ado \n+o \n suport\n-ar\n+e\n  oficial\n-mente \n+  d\n a li\n@@ -1394,11 +1394,14 @@\n r%3E%0A%0A\n-Not\n+Observ\n e qu\n@@ -3798,23 +3798,19 @@\n ora \n-falta \n adicion\n-ar\n+emos\n  alg\n@@ -4525,20 +4525,17 @@\n br%3E%0ACom \n-este\n+o\n s import\n@@ -4540,17 +4540,21 @@\n rts \n-poderemos\n+ser%C3%A1 poss%C3%ADvel\n  uti\n@@ -4574,29 +4574,29 @@\n  fun%C3%A7%C3%B5es do \n-javas\n+JavaS\n cript no Kot\n@@ -7594,17 +7594,16 @@\n o %5Bregex\n-!\n %5D(https:\n@@ -7790,22 +7790,22 @@\n s%C3%A3o as %5B\n-d\n+D\n ata \n-c\n+C\n lasses%5D(\n@@ -7996,18 +7996,16 @@\n iciemos \n-a \n uma nova\n@@ -10269,16 +10269,152 @@\n cimento.\n+ Para quem %C3%A9 programador Android, se sentir%C3%A1 mais confort%C3%A1vel em programar para a Web (recomendo o %5Bktor%5D(http://ktor.io/) para backend)\n %0A%0AAl%C3%A9m d\n@@ -10929,29 +10929,17 @@\n eca \n-e com integra%C3%A7%C3%A3o para\n+incluindo\n  os \n@@ -11073,33 +11073,34 @@\n 0)%0A%0A\n-Este c%C3%B3digo est%C3%A1 presente\n+Baixe o projeto de exemplo\n  no \n",
      "json_metadata": "{\"tags\":[\"kotlin\",\"javascript\",\"kotlin-javascript\",\"html\",\"jetbrains\"],\"image\":[\"https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png\",\"https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png\",\"https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png\",\"https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png\",\"https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png\",\"https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png\",\"https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png\",\"https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png\",\"https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png\",\"https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif\",\"https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png\",\"https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png\",\"https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png\"],\"links\":[\"https://kotlinlang.org/\",\"https://developer.android.com/kotlin/\",\"http://try.kotlinlang.org/\",\"https://www.programiz.com/kotlin-programming/examples/check-string-numeric\",\"https://kotlinlang.org/docs/reference/data-classes.html\",\"http://pypl.github.io/IDE.html\",\"https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en\",\"http://ktor.io/\",\"https://github.com/JetBrains/create-react-kotlin-app\",\"https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7\",\"https://github.com/Kotlin/kotlinx.html\",\"https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0\",\"https://github.com/feliperce/KotlinToJavaScript\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/01 22:36:15
voterfastresteem
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight100 (1.00%)
Transaction InfoBlock #23816141/Trx a111a450065d85030e65aeb40421d34f80426274
View Raw JSON Data
{
  "trx_id": "a111a450065d85030e65aeb40421d34f80426274",
  "block": 23816141,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:36:15",
  "op": [
    "vote",
    {
      "voter": "fastresteem",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 100
    }
  ]
}
2018/07/01 22:36:03
parent author
parent permlinkkotlin
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
titleProgramando em Kotlin para JavaScript
body@@ -1,20 +1,124 @@ +!%5Bkotlin.png%5D(https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png)%0A Este artigo %C3%A9 para d @@ -1191,18 +1191,17 @@ ra%C3%A7%C3%A3o.%0A%0A -1. +* Primeir @@ -1554,18 +1554,17 @@ enter%3E%0A%0A -2. +* Agora c @@ -1795,18 +1795,17 @@ enter%3E%0A%0A -3. +* Adicion @@ -2042,18 +2042,17 @@ %60%0A%3C/br%3E%0A -4. +* Substit @@ -2591,18 +2591,17 @@ ca%C3%A7%C3%A3o.%0A%0A -5. +* Crie um @@ -2725,18 +2725,17 @@ %60%0A%3C/br%3E%0A -6. +* Compile @@ -3082,18 +3082,17 @@ enter%3E%0A%0A -7. +* Agora r @@ -3846,18 +3846,17 @@ santes!%0A -1. +* Adicion @@ -4413,18 +4413,17 @@ %60%0A%3C/br%3E%0A -2. +* No arqu @@ -4600,18 +4600,17 @@ Kotlin.%0A -3. +* Na fun%C3%A7 @@ -4891,18 +4891,17 @@ %60%0A%3C/br%3E%0A -4. +* O impor @@ -5388,18 +5388,17 @@ a%C3%A7%C3%B5es!%0A%0A -5. +* Retorne @@ -5824,18 +5824,17 @@ %60%0A%3C/br%3E%0A -6. +* Ent%C3%A3o c @@ -6058,18 +6058,17 @@ %60%0A%3C/br%3E%0A -7. +* Rode a @@ -6403,18 +6403,18 @@ isto!%0A%0A -8. +%0A* Altere @@ -8032,18 +8032,17 @@ m ela.%0A%0A -1. +* Crie um @@ -8171,18 +8171,17 @@ %60%0A%3C/br%3E%0A -2. +* Inicial @@ -8753,18 +8753,17 @@ udado!%0A%0A -3. +* Adicion
json metadata{"tags":["kotlin","javascript","kotlin-javascript","html","jetbrains"],"image":["https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png","https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png","https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png","https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png","https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png","https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png","https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png","https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png","https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png","https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif","https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png","https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png","https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png"],"links":["https://kotlinlang.org/","https://developer.android.com/kotlin/","http://try.kotlinlang.org/","https://www.programiz.com/kotlin-programming/examples/check-string-numeric","https://kotlinlang.org/docs/reference/data-classes.html","http://pypl.github.io/IDE.html","https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en","https://github.com/JetBrains/create-react-kotlin-app","https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7","https://github.com/Kotlin/kotlinx.html","https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0","https://github.com/feliperce/KotlinToJavaScript"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23816137/Trx bbac82c7043782772d7534b981c4732b5b2929ec
View Raw JSON Data
{
  "trx_id": "bbac82c7043782772d7534b981c4732b5b2929ec",
  "block": 23816137,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:36:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kotlin",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "title": "Programando em Kotlin para JavaScript",
      "body": "@@ -1,20 +1,124 @@\n+!%5Bkotlin.png%5D(https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png)%0A\n Este artigo %C3%A9 para d\n@@ -1191,18 +1191,17 @@\n ra%C3%A7%C3%A3o.%0A%0A\n-1.\n+*\n  Primeir\n@@ -1554,18 +1554,17 @@\n enter%3E%0A%0A\n-2.\n+*\n  Agora c\n@@ -1795,18 +1795,17 @@\n enter%3E%0A%0A\n-3.\n+*\n  Adicion\n@@ -2042,18 +2042,17 @@\n %60%0A%3C/br%3E%0A\n-4.\n+*\n  Substit\n@@ -2591,18 +2591,17 @@\n ca%C3%A7%C3%A3o.%0A%0A\n-5.\n+*\n  Crie um\n@@ -2725,18 +2725,17 @@\n %60%0A%3C/br%3E%0A\n-6.\n+*\n  Compile\n@@ -3082,18 +3082,17 @@\n enter%3E%0A%0A\n-7.\n+*\n  Agora r\n@@ -3846,18 +3846,17 @@\n santes!%0A\n-1.\n+*\n  Adicion\n@@ -4413,18 +4413,17 @@\n %60%0A%3C/br%3E%0A\n-2.\n+*\n  No arqu\n@@ -4600,18 +4600,17 @@\n Kotlin.%0A\n-3.\n+*\n  Na fun%C3%A7\n@@ -4891,18 +4891,17 @@\n %60%0A%3C/br%3E%0A\n-4.\n+*\n  O impor\n@@ -5388,18 +5388,17 @@\n a%C3%A7%C3%B5es!%0A%0A\n-5.\n+*\n  Retorne\n@@ -5824,18 +5824,17 @@\n %60%0A%3C/br%3E%0A\n-6.\n+*\n  Ent%C3%A3o c\n@@ -6058,18 +6058,17 @@\n %60%0A%3C/br%3E%0A\n-7.\n+*\n  Rode a \n@@ -6403,18 +6403,18 @@\n  isto!%0A%0A\n-8.\n+%0A*\n  Altere \n@@ -8032,18 +8032,17 @@\n m ela.%0A%0A\n-1.\n+*\n  Crie um\n@@ -8171,18 +8171,17 @@\n %60%0A%3C/br%3E%0A\n-2.\n+*\n  Inicial\n@@ -8753,18 +8753,17 @@\n udado!%0A%0A\n-3.\n+*\n  Adicion\n",
      "json_metadata": "{\"tags\":[\"kotlin\",\"javascript\",\"kotlin-javascript\",\"html\",\"jetbrains\"],\"image\":[\"https://cdn.steemitimages.com/DQmZxXG3fTjG38xiysMiykZsyqGcP2EmjZ3oVdFUkvjGyeL/kotlin.png\",\"https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png\",\"https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png\",\"https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png\",\"https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png\",\"https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png\",\"https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png\",\"https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png\",\"https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png\",\"https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif\",\"https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png\",\"https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png\",\"https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png\"],\"links\":[\"https://kotlinlang.org/\",\"https://developer.android.com/kotlin/\",\"http://try.kotlinlang.org/\",\"https://www.programiz.com/kotlin-programming/examples/check-string-numeric\",\"https://kotlinlang.org/docs/reference/data-classes.html\",\"http://pypl.github.io/IDE.html\",\"https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en\",\"https://github.com/JetBrains/create-react-kotlin-app\",\"https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7\",\"https://github.com/Kotlin/kotlinx.html\",\"https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0\",\"https://github.com/feliperce/KotlinToJavaScript\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/01 22:26:12
votersudenaz
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight10000 (100.00%)
Transaction InfoBlock #23815940/Trx 567ede482a2c16f25c52b32dd2245f0069555629
View Raw JSON Data
{
  "trx_id": "567ede482a2c16f25c52b32dd2245f0069555629",
  "block": 23815940,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:26:12",
  "op": [
    "vote",
    {
      "voter": "sudenaz",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 10000
    }
  ]
}
2018/07/01 22:25:00
voterax3
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
weight100 (1.00%)
Transaction InfoBlock #23815916/Trx c7d8421b54491b5301594091fa5c06772c630e55
View Raw JSON Data
{
  "trx_id": "c7d8421b54491b5301594091fa5c06772c630e55",
  "block": 23815916,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:25:00",
  "op": [
    "vote",
    {
      "voter": "ax3",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "weight": 100
    }
  ]
}
2018/07/01 22:24:48
parent author
parent permlinkkotlin
authorfeliperce
permlinkprogramando-em-kotlin-para-javascript
titleProgramando em Kotlin para JavaScript
bodyEste artigo é para demonstrar como compilar código Kotlin em Javascript, utilizando um projeto simples. ## O que é Kotlin [Kotlin](https://kotlinlang.org/) é uma linguagem de programação desenvolvida pela JetBrains, criada para ter total interoperabilidade com a linguagem Java. Pode ser compilada para a JVM, código nativo, Android e traduzida para Javascript. Kotlin foi criado em 2011, porém, somente teve uma adoção massiva quando no Google I/O 2017 foi anunciado suportar oficialmente a linguagem no [desenvolvimento Android](https://developer.android.com/kotlin/) ## Criando o primeiro projeto Kotlin para Javascript Este artigo é destinado para quem já tem um conhecimento em Kotlin, por isto não exemplificarei sobre suas funções e sintaxe... Porém, há vários artigos, documentações e é até possível testar em uma [ferramenta oficial online](http://try.kotlinlang.org/), recomendo! É recomendado que se crie o projeto com Gradle (facilitará muito na hora de gerenciar dependências), porém para este exemplo utilizarei o próprio wizard da IntelliJ, para facilitar a demonstração. 1. Primeiro, crie um novo projeto em Kotlin > Kotlin/JS: <center>![New Project_005.png](https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png)</center> Note que uma lib foi adicionada. <center>![lib](https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png)</center> 2. Agora crie um arquivo html com nome "index" <center>![index](https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png)</center> 3. Adicione duas tags script no index.html: ```javascript <script type="text/javascript" src="out/production/(SeuProjeto)/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/(SeuProjeto)/(SeuMódulo).js"></script> ``` </br> 4. Substitua "(SeuProjeto)" pelo nome do seu projeto e "(SeuMódulo)" pelo nome do módulo, ficando assim: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Kotlin to JavaScript!</title> </head> <body> <script type="text/javascript" src="out/production/KotlinToJavaScript/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/KotlinToJavaScript/KotlinToJavaScript.js"></script> </body> </html> ``` </br> Mantenha o kotlin.js sempre em primeiro, pois ele será utilizado pela aplicação. 5. Crie um arquivo .kt contendo uma função Main: ```Kotlin fun main(args: Array<String>) { println("WOOOOOOOOOW!!!!") } ``` </br> 6. Compile o projeto <center>![build](https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png)</center> O arquivo .js especificado no index.html será gerado na pasta out/ <center>![js gerado](https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png)</center> 7. Agora rode o index.html em algum navegador (dica: acesse o index.html e aparecerá uma opção para selecionar o navegador, ou configure o compilador para rodar o index diretamente), em seguida verifique o Javascript console: <center>![index.html](https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png)</center> </br> <center>![Seleção_008.png](https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png)</center> </br> Pronto, seu primeiro HelloWorld! ## Melhorando o projeto HelloWorld pronto, agora falta adicionar algumas funcionalidades interessantes! 1. Adicione dois inputs no index.html: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Kotlin to Html!</title> </head> <body> Que nota você daria para o Kotlin? (0-10) </br> <input type="text" id="note"> <input type="submit" id="submit" value="Enviar"> <script type="text/javascript" src="out/production/KotlinToJavaScript/lib/kotlin.js"></script> <script type="text/javascript" src="out/production/KotlinToJavaScript/KotlinToJavaScript.js"></script> </body> </html> ``` </br> 2. No arquivo Kotlin, adicione dois imports ```kotlin import kotlin.browser.* import org.w3c.dom.* ``` </br> Com estes imports poderemos utilizar algumas funções do javascript no Kotlin. 3. Na função Main, adicione uma referência do input em uma variável button, depois adicione um listener de clique: ```kotlin val button = document.getElementById("submit") as HTMLInputElement button.addEventListener("click", { window.alert("Um alert, eita!!!") }) ``` </br> 4. O import implementado no início te possibilita usar recursos do javascript, como o `document.getElementById` e `window.alert`. Compile o projeto, rode novamente no navegador e clique no botão: <center>![js alert](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center> </br> Woooow, agora temos um alert! <center>https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif</center> Não pare por aí, ainda falta algumas implementações! 5. Retorne ao arquivo Kotlin e implemente uma função chamada "evaluate" que passa um `Int` como parâmetro e retorna uma `String`, o retorno desta função será a mensagem do `alert`. ```kotlin fun evaluate(value: Int): String { return when (value) { in 0..3 -> "Que absurdo!" in 4..6 -> "Invejoso!!!" in 7..10 -> "s2 Kotlin é amor s2" else -> "Informe somente número de 0 a 10, der." } } ``` </br> 6. Então chame a função no `alert`, note que o parâmetro passado é um `Int`, temos que converter a `String` para `Int`. ```kotlin button.addEventListener("click", { window.alert(evaluate(text.value.toInt())) }) ``` </br> 7. Rode a aplicação e confira! <center>![Seleção_009.png](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center> </br> Observe que caso não seja informado um número, o `alert` não será chamado, isto porque na validação do `Int` não estamos verificando palavras, hora de corrigir isto! 8. Altere a função para que seja verificada que foi passado um número, utilizando a função `toIntOrNull()` da `String`, caso a `String` não possa ser convertida para `Int` (ou seja, não é um número), então será retornado null para a variável podendo realizar uma condição. ```kotlin import kotlin.browser.* import org.w3c.dom.* fun main(args: Array<String>) { val button = document.getElementById("submit") as HTMLInputElement val text = document.getElementById("note") as HTMLInputElement button.addEventListener("click", { window.alert(evaluate(text.value)) }) } fun evaluate(value: String): String { val number: Int? = value.toIntOrNull() return if(number != null) { when (number) { in 0..3 -> "Que absurdo!" in 4..6 -> "Invejoso!!!" in 7..10 -> "s2 Kotlin é amor s2" else -> "Informe somente número de 0 a 10, der." } } else { "Informe apenas números!!" } } ``` <center>![numeros](https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png)</center> Há formas melhores para verificar se são números ou não, como o [regex!](https://www.programiz.com/kotlin-programming/examples/check-string-numeric) por exemplo, fique à vontade para testar! ## Lidando com arrays Uma das coisas mais interessantes do Kotlin são as [data classes](https://kotlinlang.org/docs/reference/data-classes.html), podemos criar POJOs de maneira mais legível, simples e sem bolilerplate, ao contrário da maneira tradicional do Java, então iniciemos a uma nova implementação com ela. 1. Crie uma `Data Class` com nome TopIde e dois atributos ```kotlin data class TopIde( var rank: Int, var name: String ) ``` </br> 2. Inicialize um array do objeto TopIde com as seguintes informações: ```kotlin private var rankArrayList: ArrayList<TopIde> = arrayListOf( TopIde(1, "Visual Studio"), TopIde(2, "Eclipse"), TopIde(3, "Android Studio"), TopIde(4, "Netbeans"), TopIde(5, "IntelliJ"), TopIde(6, "Sublime Text"), TopIde(7, "Atom"), TopIde(8, "pyCharm") ) ``` </br> Estes valores representam um [rank das IDEs mais pesquisadas](http://pypl.github.io/IDE.html) no Google, pode ser que enquanto esteja lendo este artigo o rank tenha mudado! 3. Adicione um `foreach` do array na função `Main` que mostre seus valores. ```kotlin rankArrayList.forEach { val h = document.createElement("p") val t = document.createTextNode("${it.rank} - ${it.name}") h.appendChild(t) document.body?.appendChild(h) } ``` <center>![Seleção_020.png](https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png)</center> ## Debugando a aplicação Uma das vantagens de se utilizar Kotlin para JavaScript é o Intellij IDEA, a IDE mais completa do mercado (não é obrigatório, porém, é uma IDE recomendada, já que tem total integração com Kotlin), é possível até usar recursos como o `debug`. Há alguns passos iniciais para poder utilizar o debug: 1. Instale a extensão no [Chrome!](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en) 2. Nas preferências de compilação do Intellij, marque a opção `Generate source maps`: ![Settings_018.png](https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png) Agora é possível debugar o código Kotlin utilizando o debug padrão da IDE! ## Conclusão Kotlin seria uma boa alternativa para quem prefere uma linguagem mais produtiva e estaticamente tipada, com Kotlin você terá todas possibilidades da programação em Kotlin (linguagem estaticamente tipada, funcional, erros sendo mostrados em tempo de compilação, debug com Intellij, etc.), além de estar em constante crescimento. Além de ter a possibilidade de programar em Kotlin para JavaScript puro, também poderá programar para os principais frameworks JavaScript do mercado, como o [React](https://github.com/JetBrains/create-react-kotlin-app) e [Node.js](https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7) e também poderá utilizar [DSL](https://github.com/Kotlin/kotlinx.html) para criar layouts dinâmicos. Fora do JavaScript, Kotlin tem total interoperabilidade com o Java, conseguindo integrar qualquer biblioteca e com integração para os principais frameworks Java, como o [Spring](https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0) Este código está presente no Github: https://github.com/feliperce/KotlinToJavaScript
json metadata{"tags":["kotlin","javascript","kotlin-javascript","html","jetbrains"],"image":["https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png","https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png","https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png","https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png","https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png","https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png","https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png","https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png","https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif","https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png","https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png","https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png"],"links":["https://kotlinlang.org/","https://developer.android.com/kotlin/","http://try.kotlinlang.org/","https://www.programiz.com/kotlin-programming/examples/check-string-numeric","https://kotlinlang.org/docs/reference/data-classes.html","http://pypl.github.io/IDE.html","https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en","https://github.com/JetBrains/create-react-kotlin-app","https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7","https://github.com/Kotlin/kotlinx.html","https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0","https://github.com/feliperce/KotlinToJavaScript"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23815912/Trx ac423bfeb483714655b7518097e9656efe3eb95a
View Raw JSON Data
{
  "trx_id": "ac423bfeb483714655b7518097e9656efe3eb95a",
  "block": 23815912,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-01T22:24:48",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kotlin",
      "author": "feliperce",
      "permlink": "programando-em-kotlin-para-javascript",
      "title": "Programando em Kotlin para JavaScript",
      "body": "Este artigo é para demonstrar como compilar código Kotlin em Javascript, utilizando um projeto simples.\n\n## O que é Kotlin\n\n[Kotlin](https://kotlinlang.org/) é uma linguagem de programação desenvolvida pela JetBrains, criada para ter total interoperabilidade com a linguagem Java. Pode ser compilada para a JVM, código nativo, Android e traduzida para Javascript.\n\nKotlin foi criado em 2011, porém, somente teve uma adoção massiva quando no Google I/O 2017 foi anunciado suportar oficialmente a linguagem no [desenvolvimento Android](https://developer.android.com/kotlin/)\n\n## Criando o primeiro projeto Kotlin para Javascript\n\nEste artigo é destinado para quem já tem um conhecimento em Kotlin, por isto não exemplificarei sobre suas funções e sintaxe... Porém, há vários artigos, documentações e é até possível testar em uma [ferramenta oficial online](http://try.kotlinlang.org/), recomendo!\n\nÉ recomendado que se crie o projeto com Gradle (facilitará muito na hora de gerenciar dependências), porém para este exemplo utilizarei o próprio wizard da IntelliJ, para facilitar a demonstração.\n\n1. Primeiro, crie um novo projeto em Kotlin > Kotlin/JS:\n\n<center>![New Project_005.png](https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png)</center>\n\nNote que uma lib foi adicionada.\n\n<center>![lib](https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png)</center>\n\n2. Agora crie um arquivo html com nome \"index\" \n\n<center>![index](https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png)</center>\n\n3. Adicione duas tags script no index.html:\n\n```javascript\n<script type=\"text/javascript\" src=\"out/production/(SeuProjeto)/lib/kotlin.js\"></script>\n<script type=\"text/javascript\" src=\"out/production/(SeuProjeto)/(SeuMódulo).js\"></script>\n```\n</br>\n4. Substitua \"(SeuProjeto)\" pelo nome do seu projeto e \"(SeuMódulo)\" pelo nome do módulo, ficando assim:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Kotlin to JavaScript!</title>\n</head>\n    <body>\n\n    <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/lib/kotlin.js\"></script>\n    <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/KotlinToJavaScript.js\"></script>\n    </body>\n</html>\n```\n</br>\nMantenha o kotlin.js sempre em primeiro, pois ele será utilizado pela aplicação.\n\n5. Crie um arquivo .kt contendo uma função Main:\n\n```Kotlin\nfun main(args: Array<String>) {\n    println(\"WOOOOOOOOOW!!!!\")\n}\n```\n</br>\n6. Compile o projeto\n\n<center>![build](https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png)</center>\n\nO arquivo .js especificado no index.html será gerado na pasta out/\n\n<center>![js gerado](https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png)</center>\n\n7. Agora rode o index.html em algum navegador (dica: acesse o index.html e aparecerá uma opção para selecionar o navegador, ou configure o compilador para rodar o index diretamente), em seguida verifique o Javascript console:\n\n<center>![index.html](https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png)</center>\n</br>\n\n<center>![Seleção_008.png](https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png)</center>\n</br>\nPronto, seu primeiro HelloWorld!\n\n## Melhorando o projeto\n\nHelloWorld pronto, agora falta adicionar algumas funcionalidades interessantes!\n1. Adicione dois inputs no index.html:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Kotlin to Html!</title>\n</head>\n    <body>\n    \n        Que nota você daria para o Kotlin? (0-10) </br>\n        <input type=\"text\" id=\"note\">\n        <input type=\"submit\" id=\"submit\" value=\"Enviar\">\n        \n        <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/lib/kotlin.js\"></script>\n        <script type=\"text/javascript\" src=\"out/production/KotlinToJavaScript/KotlinToJavaScript.js\"></script>\n    </body>\n</html>\n```\n</br>\n2. No arquivo Kotlin, adicione dois imports\n\n```kotlin\nimport kotlin.browser.*\nimport org.w3c.dom.*\n```\n</br>\nCom estes imports poderemos utilizar algumas funções do javascript no Kotlin.\n3. Na função Main, adicione uma referência do input em uma variável button, depois adicione um listener de clique:\n\n```kotlin\nval button = document.getElementById(\"submit\") as HTMLInputElement\n\n    button.addEventListener(\"click\", {\n        window.alert(\"Um alert, eita!!!\")\n    })\n```\n</br>\n4. O import implementado no início te possibilita usar recursos do javascript, como o `document.getElementById` e `window.alert`. Compile o projeto, rode novamente no navegador e clique no botão:\n\n<center>![js alert](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center>\n</br>\n\nWoooow, agora temos um alert!\n\n<center>https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif</center>\n\nNão pare por aí, ainda falta algumas implementações!\n\n5. Retorne ao arquivo Kotlin e implemente uma função chamada \"evaluate\" que passa um `Int` como parâmetro e retorna uma `String`, o retorno desta função será a mensagem do `alert`.\n\n```kotlin\nfun evaluate(value: Int): String {\n    return when (value) {\n        in 0..3 -> \"Que absurdo!\"\n        in 4..6 -> \"Invejoso!!!\"\n        in 7..10 -> \"s2 Kotlin é amor s2\"\n        else -> \"Informe somente número de 0 a 10, der.\"\n    }\n}\n```\n</br>\n6. Então chame a função no `alert`, note que o parâmetro passado é um `Int`,  temos que converter a `String` para `Int`.\n\n```kotlin\nbutton.addEventListener(\"click\", {\n        window.alert(evaluate(text.value.toInt()))\n    })\n```\n</br>\n7. Rode a aplicação e confira!\n\n<center>![Seleção_009.png](https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png)</center>\n</br>\nObserve que caso não seja informado um número, o `alert` não será chamado, isto porque na validação do `Int` não estamos verificando palavras, hora de corrigir isto!\n\n8. Altere a função para que seja verificada que foi passado um número, utilizando a função `toIntOrNull()` da `String`, caso a `String` não possa ser convertida para `Int` (ou seja, não é um número),  então será retornado null para a variável podendo realizar uma condição.\n\n```kotlin\nimport kotlin.browser.*\nimport org.w3c.dom.*\n\nfun main(args: Array<String>) {\n\n    val button = document.getElementById(\"submit\") as HTMLInputElement\n    val text = document.getElementById(\"note\") as HTMLInputElement\n\n    button.addEventListener(\"click\", {\n        window.alert(evaluate(text.value))\n    })\n}\n\nfun evaluate(value: String): String {\n\n    val number: Int? = value.toIntOrNull()\n\n    return if(number != null) {\n        when (number) {\n            in 0..3 -> \"Que absurdo!\"\n            in 4..6 -> \"Invejoso!!!\"\n            in 7..10 -> \"s2 Kotlin é amor s2\"\n            else -> \"Informe somente número de 0 a 10, der.\"\n        }\n    } else {\n        \"Informe apenas números!!\"\n    }\n}\n```\n\n<center>![numeros](https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png)</center>\n\nHá formas melhores para verificar se são números ou não, como o [regex!](https://www.programiz.com/kotlin-programming/examples/check-string-numeric) por exemplo, fique à vontade para testar!\n\n## Lidando com arrays\n\nUma das coisas mais interessantes do Kotlin são as [data classes](https://kotlinlang.org/docs/reference/data-classes.html), podemos criar POJOs de maneira mais legível, simples e sem bolilerplate, ao contrário da maneira tradicional do Java, então iniciemos a uma nova implementação com ela.\n\n1. Crie uma `Data Class` com nome TopIde e dois atributos\n\n```kotlin\ndata class TopIde(\n    var rank: Int,\n    var name: String\n)\n```\n</br>\n2. Inicialize um array do objeto TopIde com as seguintes informações:\n\n```kotlin\nprivate var rankArrayList: ArrayList<TopIde> = arrayListOf(\n        TopIde(1, \"Visual Studio\"),\n        TopIde(2, \"Eclipse\"),\n        TopIde(3, \"Android Studio\"),\n        TopIde(4, \"Netbeans\"),\n        TopIde(5, \"IntelliJ\"),\n        TopIde(6, \"Sublime Text\"),\n        TopIde(7, \"Atom\"),\n        TopIde(8, \"pyCharm\")\n)\n```\n</br>\nEstes valores representam um [rank das IDEs mais pesquisadas](http://pypl.github.io/IDE.html) no Google, pode ser que enquanto esteja lendo este artigo o rank tenha mudado!\n\n3. Adicione um `foreach` do array na função `Main` que mostre seus valores.\n\n```kotlin\nrankArrayList.forEach {\n        val h = document.createElement(\"p\")\n        val t = document.createTextNode(\"${it.rank} - ${it.name}\")\n        h.appendChild(t)\n        document.body?.appendChild(h)\n }\n```\n<center>![Seleção_020.png](https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png)</center>\n\n## Debugando a aplicação\n\nUma das vantagens de se utilizar Kotlin para JavaScript é o Intellij IDEA, a IDE mais completa do mercado (não é obrigatório, porém, é uma IDE recomendada, já que tem total integração com Kotlin), é possível até usar recursos como o `debug`.  Há alguns passos iniciais para poder utilizar o debug:\n\n1. Instale a extensão no [Chrome!](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en)\n\n2. Nas preferências de compilação do Intellij, marque a opção `Generate source maps`:\n\n![Settings_018.png](https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png)\n\nAgora é possível debugar o código Kotlin utilizando o debug padrão da IDE!\n\n## Conclusão\n\nKotlin seria uma boa alternativa para quem prefere uma linguagem mais produtiva e estaticamente tipada, com Kotlin você terá todas possibilidades da programação em Kotlin (linguagem estaticamente tipada, funcional, erros sendo mostrados em tempo de compilação, debug com Intellij, etc.), além de estar em constante crescimento.\n\nAlém de ter a possibilidade de programar em Kotlin para JavaScript puro, também poderá programar para os principais frameworks JavaScript do mercado, como o [React](https://github.com/JetBrains/create-react-kotlin-app) e [Node.js](https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7) e também poderá utilizar [DSL](https://github.com/Kotlin/kotlinx.html) para criar layouts dinâmicos. Fora do JavaScript, Kotlin tem total interoperabilidade com o Java, conseguindo integrar qualquer biblioteca e com integração para os principais frameworks Java, como o [Spring](https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0)\n\nEste código está presente no Github: https://github.com/feliperce/KotlinToJavaScript",
      "json_metadata": "{\"tags\":[\"kotlin\",\"javascript\",\"kotlin-javascript\",\"html\",\"jetbrains\"],\"image\":[\"https://cdn.steemitimages.com/DQmT8pxRqDfxdYZtapYNEDDtQyLWSqUNgw3uSiXSkAQK9qF/New%20Project_005.png\",\"https://cdn.steemitimages.com/DQmUVLoeyLAXUhgJ98X4utHpRPkDA1UKMxWp59VogB6HqSz/Sele%C3%A7%C3%A3o_002.png\",\"https://cdn.steemitimages.com/DQmRDFMpVkucYCf35wrfEBJtJCrtCth8th2Vu4NN2QuTWBa/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20IntelliJ%20IDEA_003.png\",\"https://cdn.steemitimages.com/DQmVZbqgH8ske5eNFbj5JNzTZoSHucJZZhqVDx6aEaGfDzP/Sele%C3%A7%C3%A3o_006.png\",\"https://cdn.steemitimages.com/DQmfSkPLXQ7uYcrJbEdLynHcDHhWR9hKnnM61WESwKKyRf6/Sele%C3%A7%C3%A3o_004.png\",\"https://cdn.steemitimages.com/DQmd8hvYecttoAtLeztaes2ckP2L2oXiZ1VYNNX1CLv46NL/KotlinToJavaScript%20[~-IdeaProjects-KotlinToJavaScript]%20-%20...-src-index.html%20[KotlinToJavaScript]%20-%20IntelliJ%20IDEA_007.png\",\"https://cdn.steemitimages.com/DQmNZaQEsmPKqWGCLXoeWEbzWvkiedaQLnAJpRJJGmsu6X1/Sele%C3%A7%C3%A3o_008.png\",\"https://cdn.steemitimages.com/DQmYo4LAYmEuwfDhMWygYZePGpCmthhSJ4N94pEZAL5h5QV/Sele%C3%A7%C3%A3o_009.png\",\"https://media.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif\",\"https://cdn.steemitimages.com/DQmYLXNwNceCGTUQNYrqFyCPUBhAZenqtAiYj1T9Bao2vdg/Sele%C3%A7%C3%A3o_011.png\",\"https://cdn.steemitimages.com/DQmPZgnMffDin1xabvfm7fypFogxG4FBaxP1zKjiAqTgzat/Sele%C3%A7%C3%A3o_020.png\",\"https://cdn.steemitimages.com/DQmZQEDdSjGMo12gjiRGpEMkkrboTkEtFDnzF4FpAKmRZcd/Settings_018.png\"],\"links\":[\"https://kotlinlang.org/\",\"https://developer.android.com/kotlin/\",\"http://try.kotlinlang.org/\",\"https://www.programiz.com/kotlin-programming/examples/check-string-numeric\",\"https://kotlinlang.org/docs/reference/data-classes.html\",\"http://pypl.github.io/IDE.html\",\"https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=en\",\"https://github.com/JetBrains/create-react-kotlin-app\",\"https://medium.com/@Miqubel/your-first-node-js-app-with-kotlin-30e07baa0bf7\",\"https://github.com/Kotlin/kotlinx.html\",\"https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0\",\"https://github.com/feliperce/KotlinToJavaScript\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemdelegated 6.116 SP to @feliperce
2018/06/30 07:49:36
delegatorsteem
delegateefeliperce
vesting shares9946.335147 VESTS
Transaction InfoBlock #23769612/Trx 768f95c58f78458b1a79dbf8cd07f825e529ba97
View Raw JSON Data
{
  "trx_id": "768f95c58f78458b1a79dbf8cd07f825e529ba97",
  "block": 23769612,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-30T07:49:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "9946.335147 VESTS"
    }
  ]
}
2018/03/31 06:41:30
required auths[]
required posting auths["feliperce"]
idfollow
json["follow",{"follower":"feliperce","following":"paratii","what":["blog"]}]
Transaction InfoBlock #21149613/Trx 52dc7719a6021920486971abc34f501b4a91582a
View Raw JSON Data
{
  "trx_id": "52dc7719a6021920486971abc34f501b4a91582a",
  "block": 21149613,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-31T06:41:30",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "feliperce"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"feliperce\",\"following\":\"paratii\",\"what\":[\"blog\"]}]"
    }
  ]
}
felipercereceived 0.002 STEEM, 0.055 SBD, 0.041 SP author reward for @feliperce / introducao-a-persistencia-de-dados-com-room
2018/03/20 03:20:39
authorfeliperce
permlinkintroducao-a-persistencia-de-dados-com-room
sbd payout0.055 SBD
steem payout0.002 STEEM
vesting payout67.352830 VESTS
Transaction InfoBlock #20829693/Virtual Operation #11
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 20829693,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 11,
  "timestamp": "2018-03-20T03:20:39",
  "op": [
    "author_reward",
    {
      "author": "feliperce",
      "permlink": "introducao-a-persistencia-de-dados-com-room",
      "sbd_payout": "0.055 SBD",
      "steem_payout": "0.002 STEEM",
      "vesting_payout": "67.352830 VESTS"
    }
  ]
}
2018/03/18 19:30:03
parent authorfeliperce
parent permlinkre-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t191656356z
authornathantemi
permlinkre-feliperce-re-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t192954193z
title
bodyThanks
json metadata{"tags":["photograghy"],"app":"steemit/0.1"}
Transaction InfoBlock #20791490/Trx ce32fbb9f410a4fd51815dfd3140e638c728e146
View Raw JSON Data
{
  "trx_id": "ce32fbb9f410a4fd51815dfd3140e638c728e146",
  "block": 20791490,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:30:03",
  "op": [
    "comment",
    {
      "parent_author": "feliperce",
      "parent_permlink": "re-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t191656356z",
      "author": "nathantemi",
      "permlink": "re-feliperce-re-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t192954193z",
      "title": "",
      "body": "Thanks",
      "json_metadata": "{\"tags\":[\"photograghy\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/03/18 19:18:03
parent authorfeliperce
parent permlinkdescentralizacao-e-o-futuro
authoripostbtcprice
permlinkre-descentralizacao-e-o-futuro-20180318t191801
title
bodyFor future viewers: price of bitcoin at the moment of posting is 7432.60USD
json metadata
Transaction InfoBlock #20791250/Trx abd5fcff9ab4b05ee09dd9540eb39eb050f167bc
View Raw JSON Data
{
  "trx_id": "abd5fcff9ab4b05ee09dd9540eb39eb050f167bc",
  "block": 20791250,
  "trx_in_block": 48,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:18:03",
  "op": [
    "comment",
    {
      "parent_author": "feliperce",
      "parent_permlink": "descentralizacao-e-o-futuro",
      "author": "ipostbtcprice",
      "permlink": "re-descentralizacao-e-o-futuro-20180318t191801",
      "title": "",
      "body": "For future viewers: price of bitcoin at the moment of posting is 7432.60USD",
      "json_metadata": ""
    }
  ]
}
2018/03/18 19:17:33
voterfeliperce
authornathantemi
permlinkmost-amazing-and-adventurous-cave-of-the-universe
weight10000 (100.00%)
Transaction InfoBlock #20791240/Trx 3e4f3a88d211c506ec42b764773a5d629beb3324
View Raw JSON Data
{
  "trx_id": "3e4f3a88d211c506ec42b764773a5d629beb3324",
  "block": 20791240,
  "trx_in_block": 57,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:17:33",
  "op": [
    "vote",
    {
      "voter": "feliperce",
      "author": "nathantemi",
      "permlink": "most-amazing-and-adventurous-cave-of-the-universe",
      "weight": 10000
    }
  ]
}
2018/03/18 19:17:00
parent authornathantemi
parent permlinkmost-amazing-and-adventurous-cave-of-the-universe
authorfeliperce
permlinkre-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t191656356z
title
bodyI think that will be good if you resize the image
json metadata{"tags":["photograghy"],"app":"steemit/0.1"}
Transaction InfoBlock #20791229/Trx b60b0ac29ab37132a3d2bbf41dc813d766a6f6c0
View Raw JSON Data
{
  "trx_id": "b60b0ac29ab37132a3d2bbf41dc813d766a6f6c0",
  "block": 20791229,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:17:00",
  "op": [
    "comment",
    {
      "parent_author": "nathantemi",
      "parent_permlink": "most-amazing-and-adventurous-cave-of-the-universe",
      "author": "feliperce",
      "permlink": "re-nathantemi-most-amazing-and-adventurous-cave-of-the-universe-20180318t191656356z",
      "title": "",
      "body": "I think that will be good if you resize the image",
      "json_metadata": "{\"tags\":[\"photograghy\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/03/18 19:15:21
voterfeliperce
authorfeliperce
permlinkdescentralizacao-e-o-futuro
weight10000 (100.00%)
Transaction InfoBlock #20791196/Trx cdcaa6ac1ca02e3b57e4c392c8280b9d8e494232
View Raw JSON Data
{
  "trx_id": "cdcaa6ac1ca02e3b57e4c392c8280b9d8e494232",
  "block": 20791196,
  "trx_in_block": 30,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:15:21",
  "op": [
    "vote",
    {
      "voter": "feliperce",
      "author": "feliperce",
      "permlink": "descentralizacao-e-o-futuro",
      "weight": 10000
    }
  ]
}
2018/03/18 19:15:21
parent author
parent permlinkcryptomoeda
authorfeliperce
permlinkdescentralizacao-e-o-futuro
titleDescentralização é o futuro
body![shutterstock_653153299-650x360.jpg](https://steemitimages.com/DQmPLzX57bL1chxGgGkqCTC2gFYtKC4hFpb2AgDvGczqoam/shutterstock_653153299-650x360.jpg) > 03/Jan/2009 Chanceler à beira do segundo resgate dos bancos Foi o que Satoshi Nakamoto escreveu no [Genesis Block](https://blockchain.info/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b), dando início a tecnologia mais revolucionária e disruptiva desde a criação da internet. O que há 9 anos atrás era visto como algo restrito a nerds libertários, atualmente é reconhecido como o início de um novo conceito, um experimento que ainda não está totalmente maduro, mas que futuramente trará grandes mudanças econômicas e sociais. Nunca havíamos pensado que seria possível transferir dinheiro de um país para o outro sem “a benção” de terceiros, quem imaginaria que existiria uma alternativa ao dinheiro estatal e isso teria um bom uso para cidadões de [países em crise?](http://pt.euronews.com/2017/12/15/bitcoin-ganha-terreno-na-venezuela) https://www.youtube.com/watch?v=4bJ6WBJVYjA <center>*(legenda disponível)*</center> Porém, este artigo não é para falar do Bitcoin, e sim de toda tecnologia que surgiu e está surgindo por causa do novo conceito trazido pelo Bitcoin, seria necessário um artigo especifico para falar sobre Bitcoin (farei futuramente), porém deixo um vídeo de uma palestra do Fernando Ulrich bastante explicativo: https://www.youtube.com/watch?v=VScVCr5iMWM ### OpenDime ![opendime.png](https://steemitimages.com/DQmZgSXjNwdRGJSnSmGMWvnBzTSTxkp6Q25iKRx5Wemkp6M/opendime.png) A proposta do [Opendime](https://opendime.com/) é transformar algo digital (como o bitcoin) em algo físico, dando a oportunidade de realizar transferências offline sem taxas, instantaneamente e de forma anônima, é conhecido pela comunidade como “Bitcoin Stick”. Opendime é semelhante a um pendrive, porém, é apenas para leitura, ou seja, não há como sobrescrever o que tem dentro, sua chave privada é gerada dentro do aparelho e ninguém sabe sobre ela (nem mesmo quem utiliza), para realizar pagamentos, basta apenas quebrar um dispositivo de segurança, conectar o Opendime em uma entrada USB e transferir a cryptomoeda para alguma wallet. Opendime foi criado para ser descartável, ao quebrar o dispositivo de segurança, o usuário não poderá mais utilizar o Opendime, o que dará mais segurança para quem está recebendo o pagamento, pois se este dispositivo foi violado, então o Opendime foi utilizado. ### OpenBazaar ![openbazaar.png](https://steemitimages.com/DQmaoDhjBF8GYQbiYJDmkb8KsRg5uXvKqi6bDBhguHm2UuE/openbazaar.png) [Openbazaar](https://www.openbazaar.org/) é uma aplicação de comércio online descentralizada e gratuita, a aplicação funciona de modo P2P, não possuindo um servidor central e aceitando pagamentos apenas com cryptomoedas, inicialmente OpenBazaar surgiu para corrigir as falhas do [Silk Road](https://pt.wikipedia.org/wiki/Silk_Road), hoje é uma crescente plataforma de comércio online descentralizado a qual já recebeu investimentos milionários. Não há limites de dados, regulamentações, taxas e restrições, a aplicação fornece funcionalidades de fácil uso para comerciantes poderem realizar suas vendas de forma simples e anônima. O funcionamento é semelhante ao Mercado Livre, arrisco dizer que é um Mercado Livre realmente livre. Assim como o Bitcoin e outras cryptomoedas, OpenBazaar se baseia na confiança, todas as compras/vendas são de total responsabilidade de seus autores, vendedores e seus produtos são avaliados com reviews e notas de seus clientes e também há a possibilidade do comprador adicionar um terceiro (no caso, outro usuário da aplicação) para avaliar todo o processo da compra caso tenha algum problema, o que é chamado de “disputa” em plataformas como o Mercado “Livre”, porém, sem a necessidade de uma entidade centralizadora, este terceiro cobrará uma taxa por seu serviço (uma oportunidade de levantar uma graninha?). ### Ethereum ![ethereum.png](https://steemitimages.com/DQmRs6hmxWjZSqarfMuppYbYcQvycn62S9nhyb3F9V2QTxP/ethereum.png) [Ethereum](https://www.ethereum.org/) é uma plataforma descentralizada baseada na blockchain, possui uma cryptomoeda chamada Ether, porém, seu foco está em sua maior inovação, os Smart Contracts (Contratos Inteligentes). Smart Contracts são contratos negociáveis que permitem que pessoas façam negócios entre si com base na confiança, sem a necessidade de uma entidade centralizadora, assim como um documento comum, um Smart Contract pode conter regras e pode ser criado por qualquer pessoa, porém, não há um documento impresso, os contratos são escritos com códigos de programação (existem interfaces que facilitam esta criação) e todo o processo é validado na rede da Ethereum, sem qualquer regulamentação, censura e impedimento por parte de terceiros. Um programador pode licenciar seu software com Smart Contracts, o software ao identificar o não pagamento do cliente, pode ativar uma validação que por meio do Smart Contracts seja validado o não pagamento, desativando o mesmo e posteriormente o bloqueio do software, um corretor por meio do Smart Contracts pode registrar a posse do imóvel de seu cliente, tornando o contrato inviolável e sem depender de burocracias de terceiros (Alô cartório) Além do uso comum que se há em contratos tradicionais, Smart Contracts podem ser negociados como aplicações de crédito e ICOs (Initial Coin Offering). ### ICO ![ico.jpeg](https://steemitimages.com/DQmWwitpBTNsCN48TKmuWEcMPVvqPYffwkTuv8Jj4Ntu5uL/ico.jpeg) Initial Coin Offering (Oferta Inicial de Moeda) ou ICO, é uma forma de fornecer uma nova moeda ou token em troca de alguma outra moeda, atualmente é bastante utilizado para financiar projetos. Com os avanços das cryptomoedas, ICOs se tornaram bastante populares para financiar projetos envolvendo cryptomoedas e blockchain. Uma empresa interessada em financiamento para um projeto pode iniciar um ICO, propondo que financiadores enviem cryptomoedas para a empresa, em troca de uma quantidade de tokens, gerando um smart contract entre as duas partes, assim depois de um determinado tempo, o token estará disponível para venda em exchanges, algumas ICOs fornecem participação nos lucros como é o caso do [Bankera](https://bankera.com/?ref=128802220). ICOs seriam ações desburocratizadas e totalmente voltadas ao novo conceito de descentralização que as cryptomoedas estão trazendo. Tem uma ideia inovadora mas não tem capital? Que tal abrir uma ICO? ICOs trouxeram um meio para que qualquer pessoa interessada em um projeto ou ideia possa financiar-la, sem burocratas e regulamentações inúteis, você não precisa ser rico ou se sujeitar a longos processos e limitações para financiar algo que acredita! ### Golem ![golem.jpeg](https://steemitimages.com/DQmcbNkxK5oeL59ugEGhkA29Q6y5uVa5KgsjHwTxxV4KyCd/golem.jpeg) Já pensou na possibilidade de alugar um super computador? Com a rede [Golem](https://golem.network/) é possível. Golem é uma rede que utiliza a blockchain para compartilhar poder computacional. Computadores são recompensados por emprestarem seu poder computacional (processo semelhante a mineração do Bitcoin) enquanto que um usuário da rede golem usa este poder para realizar tarefas pesadas, como renderizar gráficos por exemplo. Futuramente a rede Golem pretende atingir áreas diversas, como Machine Learning, Computação cientifica, Microservices, etc. ### Lisk ![lisk.png](https://steemitimages.com/DQmVM4JzCCNRBMdJ5vBL8dWHPLBrjEAFis647WbXX5qQt7S/lisk.png) Um dos ICOs de sucesso, [Lisk](https://lisk.io/) é uma plataforma, uma cryptomoeda e um framework que tem como proposta tornar a blockchain mais acessível para todos. Lisk fornece um SDK Javascript para que desenvolvedores possam desenvolver aplicações completas com uma blockchain customizada, permitindo desenvolver desde o algoritmo de consenso até o frontend (interface do usuário) e backend (lógica da aplicação) da aplicação. Lisk é uma grande plataforma que oferece não apenas o SDK para desenvolvedores mas como também uma plataforma para publicação descentralizada de aplicações desenvolvidas para a blockchain (como a Apple Store, Play Store), há muito o que falar sobre as soluções do Lisk, porém, para o artigo não ficar gigante, falarei disto em um artigo especifico futuramente. ### Streamr DATA ![streamr.jpeg](https://steemitimages.com/DQmdScgFsFqYVU4RCxSujafhMWoxTRc944zfTUQU5dw43tv/streamr.jpeg) Imagine que você tenha que viajar de carro para alguma cidade distante, você não sabe qual o preço da gasolina dos postos durante o trajeto, não sabe se haverá buracos e se haver, não sabe aonde estão, não teria precisão conferir em aplicativos como o Waze, pois as informações não são atualizadas em tempo real e estão centralizadas em uma corporação. [Streamr DATA](https://www.streamr.com/), é uma tecnologia para compartilhamento de dados em tempo real utilizando a blockchain da Ethereum. Atualmente dados que produzimos estão nas mãos de corporações, com a rede Streamr é possível que o usuário gere e venda seus dados de uma forma descentralizada P2P. Um carro pode gerar dados sobre o preço de um posto a qual abasteceu e automaticamente vender para outros carros na rede Streamr, outro carro pode vender para anunciantes dados sobre as características e condições do carro ou sobre condições das estradas para empresas de tráfego. Streamr fornece uma ferramenta gráfica de fácil uso para a criação destas aplicações. ## Conclusão É inegável toda a inovação que o surgimento das cryptomoedas trouxe e trará, vários conceitos estão surgindo, várias inovações saíram da garagem e vários projetos se iniciaram. Há 10 anos atrás investimentos eram restritos a uma elite de pessoas, hoje com ICOs qualquer um pode investir ou levantar investimentos no que acredita, há10 anos atrás era altamente caro, lento e burocrático transferir dinheiro para outro país, hoje é possível, com poucos cliques em seu computador. Da internet surgiu o P2P, do P2P surgiu o Bitcoin e a blockchain, do Bitcoin surgiu o Ethereum, do Ethereum e do Bitcoin surgiram nova soluções… É um processo evolutivo claro. Quem será a moeda “do futuro”, Bitcoin, Raiblocks, Ether? Proof of Work, Proof of Stake? Blockchain do Bitcoin, da Ethereum ou de algum chinês que não dorme? Lighting Network resolverá o problema da escalabilidade? Satoshi Nakamoto é um alien infiltrado pela CIA para desestabilizar a economia brasileira e depois vender o pré-sal para os EUA? É bolacha ou biscoito? Não sei. Mas uma coisa é certa, *_o futuro será descentralizado_*.
json metadata{"tags":["cryptomoeda","blockchain","bitcoin","ethereum","pt-br"],"image":["https://steemitimages.com/DQmPLzX57bL1chxGgGkqCTC2gFYtKC4hFpb2AgDvGczqoam/shutterstock_653153299-650x360.jpg","https://img.youtube.com/vi/4bJ6WBJVYjA/0.jpg","https://img.youtube.com/vi/VScVCr5iMWM/0.jpg","https://steemitimages.com/DQmZgSXjNwdRGJSnSmGMWvnBzTSTxkp6Q25iKRx5Wemkp6M/opendime.png","https://steemitimages.com/DQmaoDhjBF8GYQbiYJDmkb8KsRg5uXvKqi6bDBhguHm2UuE/openbazaar.png","https://steemitimages.com/DQmRs6hmxWjZSqarfMuppYbYcQvycn62S9nhyb3F9V2QTxP/ethereum.png","https://steemitimages.com/DQmWwitpBTNsCN48TKmuWEcMPVvqPYffwkTuv8Jj4Ntu5uL/ico.jpeg","https://steemitimages.com/DQmcbNkxK5oeL59ugEGhkA29Q6y5uVa5KgsjHwTxxV4KyCd/golem.jpeg","https://steemitimages.com/DQmVM4JzCCNRBMdJ5vBL8dWHPLBrjEAFis647WbXX5qQt7S/lisk.png","https://steemitimages.com/DQmdScgFsFqYVU4RCxSujafhMWoxTRc944zfTUQU5dw43tv/streamr.jpeg"],"links":["https://blockchain.info/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b","http://pt.euronews.com/2017/12/15/bitcoin-ganha-terreno-na-venezuela","https://www.youtube.com/watch?v=4bJ6WBJVYjA","https://www.youtube.com/watch?v=VScVCr5iMWM","https://opendime.com/","https://www.openbazaar.org/","https://pt.wikipedia.org/wiki/Silk_Road","https://www.ethereum.org/","https://bankera.com/?ref=128802220","https://golem.network/","https://lisk.io/","https://www.streamr.com/"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #20791196/Trx cdcaa6ac1ca02e3b57e4c392c8280b9d8e494232
View Raw JSON Data
{
  "trx_id": "cdcaa6ac1ca02e3b57e4c392c8280b9d8e494232",
  "block": 20791196,
  "trx_in_block": 30,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-18T19:15:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "cryptomoeda",
      "author": "feliperce",
      "permlink": "descentralizacao-e-o-futuro",
      "title": "Descentralização é o futuro",
      "body": "![shutterstock_653153299-650x360.jpg](https://steemitimages.com/DQmPLzX57bL1chxGgGkqCTC2gFYtKC4hFpb2AgDvGczqoam/shutterstock_653153299-650x360.jpg)\n\n> 03/Jan/2009 Chanceler à beira do segundo resgate dos bancos\n\nFoi o que Satoshi Nakamoto escreveu no [Genesis Block](https://blockchain.info/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b), dando início a tecnologia mais revolucionária e disruptiva desde a criação da internet.\n\nO que há 9 anos atrás era visto como algo restrito a nerds libertários, atualmente é reconhecido como o início de um novo conceito, um experimento que ainda não está totalmente maduro, mas que futuramente trará grandes mudanças econômicas e sociais. Nunca havíamos pensado que seria possível transferir dinheiro de um país para o outro sem “a benção” de terceiros, quem imaginaria que existiria uma alternativa ao dinheiro estatal e isso teria um bom uso para cidadões de [países em crise?](http://pt.euronews.com/2017/12/15/bitcoin-ganha-terreno-na-venezuela)\n\nhttps://www.youtube.com/watch?v=4bJ6WBJVYjA\n<center>*(legenda disponível)*</center>\n\nPorém, este artigo não é para falar do Bitcoin, e sim de toda tecnologia que surgiu e está surgindo por causa do novo conceito trazido pelo Bitcoin, seria necessário um artigo especifico para falar sobre Bitcoin (farei futuramente), porém deixo um vídeo de uma palestra do Fernando Ulrich bastante explicativo:\n\nhttps://www.youtube.com/watch?v=VScVCr5iMWM\n\n### OpenDime\n![opendime.png](https://steemitimages.com/DQmZgSXjNwdRGJSnSmGMWvnBzTSTxkp6Q25iKRx5Wemkp6M/opendime.png)\n\nA proposta do [Opendime](https://opendime.com/) é transformar algo digital (como o bitcoin) em algo físico, dando a oportunidade de realizar transferências offline sem taxas, instantaneamente e de forma anônima, é conhecido pela comunidade como “Bitcoin Stick”.\n\nOpendime é semelhante a um pendrive, porém, é apenas para leitura, ou seja, não há como sobrescrever o que tem dentro, sua chave privada é gerada dentro do aparelho e ninguém sabe sobre ela (nem mesmo quem utiliza), para realizar pagamentos, basta apenas quebrar um dispositivo de segurança, conectar o Opendime em uma entrada USB e transferir a cryptomoeda para alguma wallet. Opendime foi criado para ser descartável, ao quebrar o dispositivo de segurança, o usuário não poderá mais utilizar o Opendime, o que dará mais segurança para quem está recebendo o pagamento, pois se este dispositivo foi violado, então o Opendime foi utilizado.\n\n### OpenBazaar\n![openbazaar.png](https://steemitimages.com/DQmaoDhjBF8GYQbiYJDmkb8KsRg5uXvKqi6bDBhguHm2UuE/openbazaar.png)\n\n[Openbazaar](https://www.openbazaar.org/) é uma aplicação de comércio online descentralizada e gratuita, a aplicação funciona de modo P2P, não possuindo um servidor central e aceitando pagamentos apenas com cryptomoedas, inicialmente OpenBazaar surgiu para corrigir as falhas do [Silk Road](https://pt.wikipedia.org/wiki/Silk_Road), hoje é uma crescente plataforma de comércio online descentralizado a qual já recebeu investimentos milionários.\n\nNão há limites de dados, regulamentações, taxas e restrições, a aplicação fornece funcionalidades de fácil uso para comerciantes poderem realizar suas vendas de forma simples e anônima. O funcionamento é semelhante ao Mercado Livre, arrisco dizer que é um Mercado Livre realmente livre.\n\nAssim como o Bitcoin e outras cryptomoedas, OpenBazaar se baseia na confiança, todas as compras/vendas são de total responsabilidade de seus autores, vendedores e seus produtos são avaliados com reviews e notas de seus clientes e também há a possibilidade do comprador adicionar um terceiro (no caso, outro usuário da aplicação) para avaliar todo o processo da compra caso tenha algum problema, o que é chamado de “disputa” em plataformas como o Mercado “Livre”, porém, sem a necessidade de uma entidade centralizadora, este terceiro cobrará uma taxa por seu serviço (uma oportunidade de levantar uma graninha?).\n\n### Ethereum\n![ethereum.png](https://steemitimages.com/DQmRs6hmxWjZSqarfMuppYbYcQvycn62S9nhyb3F9V2QTxP/ethereum.png)\n\n[Ethereum](https://www.ethereum.org/) é uma plataforma descentralizada baseada na blockchain, possui uma cryptomoeda chamada Ether, porém, seu foco está em sua maior inovação, os Smart Contracts (Contratos Inteligentes).\n\nSmart Contracts são contratos negociáveis que permitem que pessoas façam negócios entre si com base na confiança, sem a necessidade de uma entidade centralizadora, assim como um documento comum, um Smart Contract pode conter regras e pode ser criado por qualquer pessoa, porém, não há um documento impresso, os contratos são escritos com códigos de programação (existem interfaces que facilitam esta criação) e todo o processo é validado na rede da Ethereum, sem qualquer regulamentação, censura e impedimento por parte de terceiros.\n\nUm programador pode licenciar seu software com Smart Contracts, o software ao identificar o não pagamento do cliente, pode ativar uma validação que por meio do Smart Contracts seja validado o não pagamento, desativando o mesmo e posteriormente o bloqueio do software, um corretor por meio do Smart Contracts pode registrar a posse do imóvel de seu cliente, tornando o contrato inviolável e sem depender de burocracias de terceiros (Alô cartório)\n\nAlém do uso comum que se há em contratos tradicionais, Smart Contracts podem ser negociados como aplicações de crédito e ICOs (Initial Coin Offering).\n\n### ICO\n![ico.jpeg](https://steemitimages.com/DQmWwitpBTNsCN48TKmuWEcMPVvqPYffwkTuv8Jj4Ntu5uL/ico.jpeg)\n\nInitial Coin Offering (Oferta Inicial de Moeda) ou ICO, é uma forma de fornecer uma nova moeda ou token em troca de alguma outra moeda, atualmente é bastante utilizado para financiar projetos.\n\nCom os avanços das cryptomoedas, ICOs se tornaram bastante populares para financiar projetos envolvendo cryptomoedas e blockchain. Uma empresa interessada em financiamento para um projeto pode iniciar um ICO, propondo que financiadores enviem cryptomoedas para a empresa, em troca de uma quantidade de tokens, gerando um smart contract entre as duas partes, assim depois de um determinado tempo, o token estará disponível para venda em exchanges, algumas ICOs fornecem participação nos lucros como é o caso do [Bankera](https://bankera.com/?ref=128802220). ICOs seriam ações desburocratizadas e totalmente voltadas ao novo conceito de descentralização que as cryptomoedas estão trazendo. Tem uma ideia inovadora mas não tem capital? Que tal abrir uma ICO?\n\nICOs trouxeram um meio para que qualquer pessoa interessada em um projeto ou ideia possa financiar-la, sem burocratas e regulamentações inúteis, você não precisa ser rico ou se sujeitar a longos processos e limitações para financiar algo que acredita!\n\n### Golem\n![golem.jpeg](https://steemitimages.com/DQmcbNkxK5oeL59ugEGhkA29Q6y5uVa5KgsjHwTxxV4KyCd/golem.jpeg)\n\nJá pensou na possibilidade de alugar um super computador?\nCom a rede [Golem](https://golem.network/) é possível. Golem é uma rede que utiliza a blockchain para compartilhar poder computacional.\n\nComputadores são recompensados por emprestarem seu poder computacional (processo semelhante a mineração do Bitcoin) enquanto que um usuário da rede golem usa este poder para realizar tarefas pesadas, como renderizar gráficos por exemplo. Futuramente a rede Golem pretende atingir áreas diversas, como Machine Learning, Computação cientifica, Microservices, etc.\n\n### Lisk\n![lisk.png](https://steemitimages.com/DQmVM4JzCCNRBMdJ5vBL8dWHPLBrjEAFis647WbXX5qQt7S/lisk.png)\n\nUm dos ICOs de sucesso, [Lisk](https://lisk.io/) é uma plataforma, uma cryptomoeda e um framework que tem como proposta tornar a blockchain mais acessível para todos.\n\nLisk fornece um SDK Javascript para que desenvolvedores possam desenvolver aplicações completas com uma blockchain customizada, permitindo desenvolver desde o algoritmo de consenso até o frontend (interface do usuário) e backend (lógica da aplicação) da aplicação.\n\nLisk é uma grande plataforma que oferece não apenas o SDK para desenvolvedores mas como também uma plataforma para publicação descentralizada de aplicações desenvolvidas para a blockchain (como a Apple Store, Play Store), há muito o que falar sobre as soluções do Lisk, porém, para o artigo não ficar gigante, falarei disto em um artigo especifico futuramente.\n\n### Streamr DATA\n![streamr.jpeg](https://steemitimages.com/DQmdScgFsFqYVU4RCxSujafhMWoxTRc944zfTUQU5dw43tv/streamr.jpeg)\n\nImagine que você tenha que viajar de carro para alguma cidade distante, você não sabe qual o preço da gasolina dos postos durante o trajeto, não sabe se haverá buracos e se haver, não sabe aonde estão, não teria precisão conferir em aplicativos como o Waze, pois as informações não são atualizadas em tempo real e estão centralizadas em uma corporação. [Streamr DATA](https://www.streamr.com/), é uma tecnologia para compartilhamento de dados em tempo real utilizando a blockchain da Ethereum.\n\nAtualmente dados que produzimos estão nas mãos de corporações, com a rede Streamr é possível que o usuário gere e venda seus dados de uma forma descentralizada P2P. Um carro pode gerar dados sobre o preço de um posto a qual abasteceu e automaticamente vender para outros carros na rede Streamr, outro carro pode vender para anunciantes dados sobre as características e condições do carro ou sobre condições das estradas para empresas de tráfego. Streamr fornece uma ferramenta gráfica de fácil uso para a criação destas aplicações.\n\n## Conclusão\nÉ inegável toda a inovação que o surgimento das cryptomoedas trouxe e trará, vários conceitos estão surgindo, várias inovações saíram da garagem e vários projetos se iniciaram. Há 10 anos atrás investimentos eram restritos a uma elite de pessoas, hoje com ICOs qualquer um pode investir ou levantar investimentos no que acredita, há10 anos atrás era altamente caro, lento e burocrático transferir dinheiro para outro país, hoje é possível, com poucos cliques em seu computador.\n\nDa internet surgiu o P2P, do P2P surgiu o Bitcoin e a blockchain, do Bitcoin surgiu o Ethereum, do Ethereum e do Bitcoin surgiram nova soluções… É um processo evolutivo claro.\nQuem será a moeda “do futuro”, Bitcoin, Raiblocks, Ether?\nProof of Work, Proof of Stake?\nBlockchain do Bitcoin, da Ethereum ou de algum chinês que não dorme?\nLighting Network resolverá o problema da escalabilidade?\nSatoshi Nakamoto é um alien infiltrado pela CIA para desestabilizar a economia brasileira e depois vender o pré-sal para os EUA?\nÉ bolacha ou biscoito?\n\nNão sei. Mas uma coisa é certa, *_o futuro será descentralizado_*.",
      "json_metadata": "{\"tags\":[\"cryptomoeda\",\"blockchain\",\"bitcoin\",\"ethereum\",\"pt-br\"],\"image\":[\"https://steemitimages.com/DQmPLzX57bL1chxGgGkqCTC2gFYtKC4hFpb2AgDvGczqoam/shutterstock_653153299-650x360.jpg\",\"https://img.youtube.com/vi/4bJ6WBJVYjA/0.jpg\",\"https://img.youtube.com/vi/VScVCr5iMWM/0.jpg\",\"https://steemitimages.com/DQmZgSXjNwdRGJSnSmGMWvnBzTSTxkp6Q25iKRx5Wemkp6M/opendime.png\",\"https://steemitimages.com/DQmaoDhjBF8GYQbiYJDmkb8KsRg5uXvKqi6bDBhguHm2UuE/openbazaar.png\",\"https://steemitimages.com/DQmRs6hmxWjZSqarfMuppYbYcQvycn62S9nhyb3F9V2QTxP/ethereum.png\",\"https://steemitimages.com/DQmWwitpBTNsCN48TKmuWEcMPVvqPYffwkTuv8Jj4Ntu5uL/ico.jpeg\",\"https://steemitimages.com/DQmcbNkxK5oeL59ugEGhkA29Q6y5uVa5KgsjHwTxxV4KyCd/golem.jpeg\",\"https://steemitimages.com/DQmVM4JzCCNRBMdJ5vBL8dWHPLBrjEAFis647WbXX5qQt7S/lisk.png\",\"https://steemitimages.com/DQmdScgFsFqYVU4RCxSujafhMWoxTRc944zfTUQU5dw43tv/streamr.jpeg\"],\"links\":[\"https://blockchain.info/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\",\"http://pt.euronews.com/2017/12/15/bitcoin-ganha-terreno-na-venezuela\",\"https://www.youtube.com/watch?v=4bJ6WBJVYjA\",\"https://www.youtube.com/watch?v=VScVCr5iMWM\",\"https://opendime.com/\",\"https://www.openbazaar.org/\",\"https://pt.wikipedia.org/wiki/Silk_Road\",\"https://www.ethereum.org/\",\"https://bankera.com/?ref=128802220\",\"https://golem.network/\",\"https://lisk.io/\",\"https://www.streamr.com/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/03/13 13:53:39
voternadezdalebedeva
authorfeliperce
permlinkintroducao-a-persistencia-de-dados-com-room
weight10000 (100.00%)
Transaction InfoBlock #20640898/Trx f3231244c508c45219079498717813f20a89088c
View Raw JSON Data
{
  "trx_id": "f3231244c508c45219079498717813f20a89088c",
  "block": 20640898,
  "trx_in_block": 42,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T13:53:39",
  "op": [
    "vote",
    {
      "voter": "nadezdalebedeva",
      "author": "feliperce",
      "permlink": "introducao-a-persistencia-de-dados-com-room",
      "weight": 10000
    }
  ]
}
2018/03/13 03:50:33
voterhr1
authorfeliperce
permlinkintroducao-a-persistencia-de-dados-com-room
weight2 (0.02%)
Transaction InfoBlock #20628844/Trx 5340a174de4cc2624951748f2b1cf5c1723cbe43
View Raw JSON Data
{
  "trx_id": "5340a174de4cc2624951748f2b1cf5c1723cbe43",
  "block": 20628844,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T03:50:33",
  "op": [
    "vote",
    {
      "voter": "hr1",
      "author": "feliperce",
      "permlink": "introducao-a-persistencia-de-dados-com-room",
      "weight": 2
    }
  ]
}
2018/03/13 03:20:39
voterfeliperce
authorfeliperce
permlinkintroducao-a-persistencia-de-dados-com-room
weight10000 (100.00%)
Transaction InfoBlock #20628246/Trx e968deeed543a9bb0b7d698767f0d36af8399f8f
View Raw JSON Data
{
  "trx_id": "e968deeed543a9bb0b7d698767f0d36af8399f8f",
  "block": 20628246,
  "trx_in_block": 35,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T03:20:39",
  "op": [
    "vote",
    {
      "voter": "feliperce",
      "author": "feliperce",
      "permlink": "introducao-a-persistencia-de-dados-com-room",
      "weight": 10000
    }
  ]
}
2018/03/13 03:20:39
parent author
parent permlinkandroid
authorfeliperce
permlinkintroducao-a-persistencia-de-dados-com-room
titleIntrodução à persistência de dados com Room
body![room.png](https://steemitimages.com/DQmNNx49UsYgRCG5q4CdmfTnscSYpQcEAyscw8VJ3M5fGaa/room.png) Todo desenvolvedor Android sabe como é complicado trabalhar com SQLite no Android, boilerplate para todos os lados, códigos acoplados e SQLs enormes, tudo isso gera uma enorme perda de produtividade e bugs que assustariam até o Frankenstein. Pensando nisto, desenvolvedores optam por sacrificar a performance da aplicação em troca de uma produtividade melhor, utilizando ORMs já conhecidos no mercado ou o Realm, mas e se existisse uma outra alternativa? Em 2017 durante o Google I/O, foram lançadas um conjunto de bibliotecas para o Android, o [Android Architecture Componentes](https://developer.android.com/topic/libraries/architecture/index.html). Entre elas, uma me chamou bastante atenção... Uma biblioteca para persistência de dados chamada [Room](https://developer.android.com/topic/libraries/architecture/room.html)! Room nada mais é que uma biblioteca para mapeamento de objetos SQLite em Java que cria uma camada de abstração sobre o SQLite, tornando desnecessária a escrita de boa parte do SQL, eliminando os problemas existentes ao usar o SQLite padrão do Android. Existem 3 componentes para se construir uma aplicação com Room: **Entity, DAO e Database**. * **Entity** representa os dados de uma tabela, referenciada por uma annotation em uma classe de dados. * **DAO** define os métodos de acesso ao banco, usando annotations para vincular o SQL com o método. * **Database** é a classe que contém referências dos DAOs, é o meio de acesso principal para a conexão com o BD. ![roomstep.png](https://steemitimages.com/DQmT5GueF3UCvFjvuEiKaC5pbykGHNnFAXA5yXvVi6a42m8/roomstep.png) Parece simples... Mas é! Como exemplo de implementação, vamos utilizar uma aplicação que está em meu [Github](https://github.com/feliperce/AndroidRoom) ### Mãos na massa 1. Primeiro, adicione as dependências em seu *build.gradle*. ``` java implementation "android.arch.persistence.room:runtime:1.0.0" annotationProcessor "android.arch.persistence.room:compiler:1.0.0" ``` 2. Agora crie uma classe Java chamada `Person`, está será a Entity, classe que representará a tabela `Person` no BD. ``` Java @Entity public class Person { @PrimaryKey(autoGenerate = true) private long id; @ColumnInfo(name = "first_name") private String firstName; @ColumnInfo(name = "last_name") private String lastName; private int age; private String email; public Person() {} public long getId() { return id; } public void setId(long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } ``` Toda `Entity` deve conter a annotation `@Entity`, note também que há outras annotations. `@PrimaryKey` indica que o atributo id deve ser uma primary key, `@ColumnInfo` define propriedades específicas da coluna, como o nome dela por exemplo, esta annotation não é obrigatória, Room automaticamente cria a coluna com o nome do atributo, caso queira que ele crie com outro nome, então use a annotation `@ColumnInfo` com a propriedade name. 3. Crie uma interface chamada `PersonDao` com a annotation `@Dao` ``` @Dao public interface PersonDao { @Insert long insert(Person person); @Insert void insertAll(List<Person> personList); @Update int update(Person person); @Delete void delete(Person person); @Query("SELECT * FROM person") List<Person> getAll(); @Query("SELECT * FROM person WHERE id = :idperson") Person getById(int idperson); } ``` Room utiliza 4 annotations no DAO, `@Insert` para inserir dados na tabela, `@Update` para atualizar dados na tabela, `@Delete` para remover dados e `@Query` para executar SQL, note que há dois métodos com `@Insert`, isto é para demonstrar que é possível fazer inserção de um único objeto e também de uma lista de objetos. 4. Crie uma classe chamada AppDatabase que estende a RoomDatabase, a classe deve conter a annotation `@Database` ``` @Database(entities = {Person.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { private static AppDatabase INSTANCE; public abstract PersonDao personDao(); public static AppDatabase getAppDatabase(Context context) { if(INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "mydb") //.fallbackToDestructiveMigration() //.allowMainThreadQueries() .build(); } return INSTANCE; } public static void destroyInstance() { INSTANCE = null; } } ``` A classe `AppDatabase` terá a tarefa de gerenciar o BD, contendo a versão do banco (declarado na propriedade version da annotation `@Database`), as `Entitys` (declarado na propriedade entity da annotation `@Database`), todos os DAOs, migrations (exemplos em um novo artigo!) e outras propriedades do banco. Note que criei a classe como um singleton, porém, não é obrigatório, fiz um singleton para não ter necessidade de instanciar a classe sempre que for usar o BD. Deixei algumas opções comentadas, `.fallbackToDestructiveMigration()` removerá os dados do BD sempre que houver uma alteração na versão, isso facilitará seus testes durante o desenvolvimento, pois o Room faz cache dos dados. `.allowMainThreadQueries()` permite que o acesso ao banco seja executado na Main Thread, use esta opção apenas caso queira fazer alguns testes e está com preguiça de criar threads, **NÃO USE ISTO EM PRODUÇÃO OU UMA TERRÍVEL MALDIÇÃO CAIRÁ SOBRE SUA APLICAÇÃO (vulgo ANR)**. 6. Tudo pronto, agora faça o teste, tente inserir um objeto `Person`! ``` final Person person = new Person(); person.setFirstName("João"); person.setLastName("Das Neves"); person.setAge(30); person.setEmail([email protected]); new Thread(new Runnable() { @Override public void run() { AppDatabase db = AppDatabase.getAppDatabase(getBaseContext()); db.personDao().insert(person); finish(); } }).start(); ``` ### Conclusão Room é uma tentativa do Google de tornar o desenvolvimento de aplicações Android mais produtivo e menos suscetivo a erros, eliminando a necessidade de usar ORMs pesados ou dar preferência ao SQLite nativo. Erros são gerados durante a compilação (escreveu SQL errado? Não compila!), há um padrão organizacional com annotations e interfaces, há integração com LiveData (próximo artigo?!) e rxJava e também há total integração com o SQLite nativo do Android, dando possibilidade de migrar seu banco nativo aos poucos. Google recomenda que se utilize o Room, inclusive, para substituir a maneira antiga de se gerenciar um banco SQLite. Nos vemos no meu próximo artigo!
json metadata{"tags":["android","room","android-architecture"],"image":["https://steemitimages.com/DQmNNx49UsYgRCG5q4CdmfTnscSYpQcEAyscw8VJ3M5fGaa/room.png","https://steemitimages.com/DQmT5GueF3UCvFjvuEiKaC5pbykGHNnFAXA5yXvVi6a42m8/roomstep.png"],"links":["https://developer.android.com/topic/libraries/architecture/index.html","https://developer.android.com/topic/libraries/architecture/room.html","https://github.com/feliperce/AndroidRoom"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #20628246/Trx e968deeed543a9bb0b7d698767f0d36af8399f8f
View Raw JSON Data
{
  "trx_id": "e968deeed543a9bb0b7d698767f0d36af8399f8f",
  "block": 20628246,
  "trx_in_block": 35,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T03:20:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "android",
      "author": "feliperce",
      "permlink": "introducao-a-persistencia-de-dados-com-room",
      "title": "Introdução à persistência de dados com Room",
      "body": "![room.png](https://steemitimages.com/DQmNNx49UsYgRCG5q4CdmfTnscSYpQcEAyscw8VJ3M5fGaa/room.png)\n\nTodo desenvolvedor Android sabe como é complicado trabalhar com SQLite no Android, boilerplate para todos os lados, códigos acoplados e SQLs enormes, tudo isso gera uma enorme perda de produtividade e bugs que assustariam até o Frankenstein. Pensando nisto, desenvolvedores optam por sacrificar a performance da aplicação em troca de uma produtividade melhor, utilizando ORMs já conhecidos no mercado ou o Realm, mas e se existisse uma outra alternativa?\n\nEm 2017 durante o Google I/O, foram lançadas um conjunto de bibliotecas para o Android, o [Android Architecture Componentes](https://developer.android.com/topic/libraries/architecture/index.html). Entre elas, uma me chamou bastante atenção... Uma biblioteca para persistência de dados chamada [Room](https://developer.android.com/topic/libraries/architecture/room.html)!\n\nRoom nada mais é que uma biblioteca para mapeamento de objetos SQLite em Java que cria uma camada de abstração sobre o SQLite, tornando desnecessária a escrita de boa parte do SQL, eliminando os problemas existentes ao usar o SQLite padrão do Android.\n\nExistem 3 componentes para se construir uma aplicação com Room: **Entity, DAO e Database**.\n\n* **Entity** representa os dados de uma tabela, referenciada por uma annotation em uma classe de dados.\n* **DAO** define os métodos de acesso ao banco, usando annotations para vincular o SQL com o método.\n* **Database** é a classe que contém referências dos DAOs, é o meio de acesso principal para a conexão com o BD.\n![roomstep.png](https://steemitimages.com/DQmT5GueF3UCvFjvuEiKaC5pbykGHNnFAXA5yXvVi6a42m8/roomstep.png)\n\nParece simples... Mas é!\nComo exemplo de implementação, vamos utilizar uma aplicação que está em meu [Github](https://github.com/feliperce/AndroidRoom)\n\n### Mãos na massa\n\n1. Primeiro, adicione as dependências em seu *build.gradle*.\n\n    ``` java\n    implementation \"android.arch.persistence.room:runtime:1.0.0\"\n    annotationProcessor \"android.arch.persistence.room:compiler:1.0.0\"\n    ```\n2. Agora crie uma classe Java chamada `Person`, está será a Entity, classe que representará a tabela `Person` no BD.\n\n    ``` Java\n    @Entity\n    public class Person {\n\n        @PrimaryKey(autoGenerate = true)\n        private long id;\n        @ColumnInfo(name = \"first_name\")\n        private String firstName;\n        @ColumnInfo(name = \"last_name\")\n        private String lastName;\n        private int age;\n        private String email;\n\n        public Person() {}\n\n        public long getId() {\n            return id;\n        }\n\n        public void setId(long id) {\n            this.id = id;\n        }\n\n        public String getFirstName() {\n            return firstName;\n        }\n\n        public void setFirstName(String firstName) {\n            this.firstName = firstName;\n        }\n\n        public String getLastName() {\n            return lastName;\n        }\n\n        public void setLastName(String lastName) {\n            this.lastName = lastName;\n        }\n\n        public int getAge() {\n            return age;\n        }\n\n        public void setAge(int age) {\n            this.age = age;\n        }\n\n        public String getEmail() {\n            return email;\n        }\n\n        public void setEmail(String email) {\n            this.email = email;\n        }\n    }\n    ```\n\n    Toda `Entity` deve conter a annotation `@Entity`, note também que há outras annotations. `@PrimaryKey` indica que o atributo id deve ser uma primary key, `@ColumnInfo` define propriedades específicas da coluna, como o nome dela por exemplo, esta annotation não é obrigatória, Room automaticamente cria a coluna com o nome do atributo, caso queira que ele crie com outro nome, então use a annotation `@ColumnInfo` com a propriedade name.\n\n3. Crie uma interface chamada `PersonDao` com a annotation `@Dao`\n\n    ```\n    @Dao\n    public interface PersonDao {\n\n        @Insert\n        long insert(Person person);\n\n        @Insert\n        void insertAll(List<Person> personList);\n\n        @Update\n        int update(Person person);\n\n        @Delete\n        void delete(Person person);\n\n        @Query(\"SELECT * FROM person\")\n        List<Person> getAll();\n\n        @Query(\"SELECT * FROM person WHERE id = :idperson\")\n        Person getById(int idperson);\n\n    }\n    ```\n    Room utiliza 4 annotations no DAO, `@Insert` para inserir dados na tabela, `@Update` para atualizar dados na tabela, `@Delete` para remover dados e `@Query` para executar SQL, note que há dois métodos com `@Insert`, isto é para demonstrar que é possível fazer inserção de um único objeto e também de uma lista de objetos.\n\n4. Crie uma classe chamada AppDatabase que estende a RoomDatabase, a classe deve conter a annotation `@Database`\n\n    ```\n    @Database(entities = {Person.class}, version = 1)\n    public abstract class AppDatabase extends RoomDatabase {\n\n        private static AppDatabase INSTANCE;\n\n        public abstract PersonDao personDao();\n\n        public static AppDatabase getAppDatabase(Context context) {\n            if(INSTANCE == null) {\n                INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, \"mydb\")\n                    //.fallbackToDestructiveMigration()\n                    //.allowMainThreadQueries()\n                    .build();\n            }\n\n            return INSTANCE;\n        }\n\n        public static void destroyInstance() {\n            INSTANCE = null;\n        }\n    }\n    ```\n    A classe `AppDatabase` terá a tarefa de gerenciar o BD, contendo a versão do banco (declarado na propriedade version da annotation `@Database`), as `Entitys` (declarado na propriedade entity da annotation `@Database`), todos os DAOs, migrations (exemplos em um novo artigo!) e outras propriedades do banco. Note que criei a classe como um singleton, porém, não é obrigatório, fiz um singleton para não ter necessidade de instanciar a classe sempre que for usar o BD. \n\n    Deixei algumas opções comentadas, `.fallbackToDestructiveMigration()` removerá os dados do BD sempre que houver uma alteração na versão, isso facilitará seus testes durante o desenvolvimento, pois o Room faz cache dos dados. `.allowMainThreadQueries()` permite que o acesso ao banco seja executado na Main Thread, use esta opção apenas caso queira fazer alguns testes e está com preguiça de criar threads, **NÃO USE ISTO EM PRODUÇÃO OU UMA TERRÍVEL MALDIÇÃO CAIRÁ SOBRE SUA APLICAÇÃO (vulgo ANR)**.\n\n6. Tudo pronto, agora faça o teste, tente inserir um objeto `Person`!\n\n    ```\n    final Person person = new Person();\n    person.setFirstName(\"João\");\n    person.setLastName(\"Das Neves\");\n    person.setAge(30);\n    person.setEmail([email protected]);\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                AppDatabase db = AppDatabase.getAppDatabase(getBaseContext());\n\n                db.personDao().insert(person);\n                finish();\n            }\n        }).start();\n    ```\n\n### Conclusão\n\nRoom é uma tentativa do Google de tornar  o desenvolvimento de aplicações Android mais produtivo e menos suscetivo a erros, eliminando a necessidade de usar ORMs pesados ou dar preferência ao SQLite nativo. Erros são gerados durante a compilação (escreveu SQL errado? Não compila!), há um padrão organizacional com annotations e interfaces, há integração com LiveData (próximo artigo?!) e rxJava e também há total integração com o SQLite nativo do Android, dando possibilidade de migrar seu banco nativo aos poucos.\n\nGoogle recomenda que se utilize o Room, inclusive, para substituir a maneira antiga de se gerenciar um banco SQLite.\n\nNos vemos no meu próximo artigo!",
      "json_metadata": "{\"tags\":[\"android\",\"room\",\"android-architecture\"],\"image\":[\"https://steemitimages.com/DQmNNx49UsYgRCG5q4CdmfTnscSYpQcEAyscw8VJ3M5fGaa/room.png\",\"https://steemitimages.com/DQmT5GueF3UCvFjvuEiKaC5pbykGHNnFAXA5yXvVi6a42m8/roomstep.png\"],\"links\":[\"https://developer.android.com/topic/libraries/architecture/index.html\",\"https://developer.android.com/topic/libraries/architecture/room.html\",\"https://github.com/feliperce/AndroidRoom\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
feliperceupdated their account properties
2018/03/13 03:12:42
accountfeliperce
memo keySTM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga
json metadata{"profile":{"profile_image":"https://i.imgur.com/d0esKHj.png","name":"Felipe Rodrigues","location":"São Paulo - SP, Brazil"}}
Transaction InfoBlock #20628088/Trx 713e4f8071158dc934cdb57ebcd602cc743bf03f
View Raw JSON Data
{
  "trx_id": "713e4f8071158dc934cdb57ebcd602cc743bf03f",
  "block": 20628088,
  "trx_in_block": 30,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T03:12:42",
  "op": [
    "account_update",
    {
      "account": "feliperce",
      "memo_key": "STM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://i.imgur.com/d0esKHj.png\",\"name\":\"Felipe Rodrigues\",\"location\":\"São Paulo - SP, Brazil\"}}"
    }
  ]
}
steemdelegated 18.706 SP to @feliperce
2018/03/13 03:08:54
delegatorsteem
delegateefeliperce
vesting shares30421.890271 VESTS
Transaction InfoBlock #20628012/Trx 20163164918ae05ba5ca00f3008bdc4ff951630e
View Raw JSON Data
{
  "trx_id": "20163164918ae05ba5ca00f3008bdc4ff951630e",
  "block": 20628012,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T03:08:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "feliperce",
      "vesting_shares": "30421.890271 VESTS"
    }
  ]
}
steemcreated a new account: @feliperce
2018/03/13 02:47:06
fee0.100 STEEM
delegation30690.000000 VESTS
creatorsteem
new account namefeliperce
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7ZMhVdxq78Zm5UwKs8nJouwyRb8EwVVmRc8JZ75RhJrs9SbJba",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5wPkvF9KFA8g3tuMHQyMgw3KLBmr3qgnFtNYN5A5dVmtDp2YsV",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6mPR55y6EmuTqfDXAxLx5bekPzL8GsVVzfN2JYxKYFycZE8bT9",1]]}
memo keySTM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga
json metadata{}
extensions[]
Transaction InfoBlock #20627576/Trx 24402b7b449e132fd9c40f540fbbee11a036a006
View Raw JSON Data
{
  "trx_id": "24402b7b449e132fd9c40f540fbbee11a036a006",
  "block": 20627576,
  "trx_in_block": 57,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-13T02:47:06",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.100 STEEM",
      "delegation": "30690.000000 VESTS",
      "creator": "steem",
      "new_account_name": "feliperce",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7ZMhVdxq78Zm5UwKs8nJouwyRb8EwVVmRc8JZ75RhJrs9SbJba",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM5wPkvF9KFA8g3tuMHQyMgw3KLBmr3qgnFtNYN5A5dVmtDp2YsV",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6mPR55y6EmuTqfDXAxLx5bekPzL8GsVVzfN2JYxKYFycZE8bT9",
            1
          ]
        ]
      },
      "memo_key": "STM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga",
      "json_metadata": "{}",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://i.imgur.com/d0esKHj.png","name":"Felipe Rodrigues","location":"São Paulo - SP, Brazil"}
JSON METADATA
profile{"profile_image":"https://i.imgur.com/d0esKHj.png","name":"Felipe Rodrigues","location":"São Paulo - SP, Brazil"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://i.imgur.com/d0esKHj.png",
      "name": "Felipe Rodrigues",
      "location": "São Paulo - SP, Brazil"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://i.imgur.com/d0esKHj.png",
      "name": "Felipe Rodrigues",
      "location": "São Paulo - SP, Brazil"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM7ZMhVdxq78Zm5UwKs8nJouwyRb8EwVVmRc8JZ75RhJrs9SbJba1/1
Active
Single Signature
Public Keys
STM5wPkvF9KFA8g3tuMHQyMgw3KLBmr3qgnFtNYN5A5dVmtDp2YsV1/1
Posting
Single Signature
Public Keys
STM6mPR55y6EmuTqfDXAxLx5bekPzL8GsVVzfN2JYxKYFycZE8bT91/1
Memo
STM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7ZMhVdxq78Zm5UwKs8nJouwyRb8EwVVmRc8JZ75RhJrs9SbJba",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5wPkvF9KFA8g3tuMHQyMgw3KLBmr3qgnFtNYN5A5dVmtDp2YsV",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6mPR55y6EmuTqfDXAxLx5bekPzL8GsVVzfN2JYxKYFycZE8bT9",
        1
      ]
    ]
  },
  "memo": "STM7TyJvN8GE3w4kMiCaV4CqDr8EfR7eQciBMSfkAxTxMBevtU4Ga"
}

Witness Votes

0 / 30
No active witness votes.
[]