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 DelegationsDeleg
+4.882SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.002STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.126SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.882SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.033SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.055SBD | SBD |
{
"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
| name | feliperce |
| id | 844447 |
| rank | 1,226,225 |
| reputation | 913098146 |
| created | 2018-03-13T02:47:06 |
| recovery_account | steem |
| proxy | None |
| post_count | 4 |
| comment_count | 0 |
| lifetime_vote_count | 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 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 204.173876 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7939.485930 VESTS |
| reward_vesting_balance | 67.352830 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2018-03-13T03:12:42 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-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
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 4.882 SP to @feliperce2026/05/18 00:16:00
steemdelegated 4.882 SP to @feliperce
2026/05/18 00:16:00
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 7939.485930 VESTS |
| Transaction Info | Block #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 @feliperce2026/05/12 03:54:09
steemdelegated 3.214 SP to @feliperce
2026/05/12 03:54:09
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 5227.275525 VESTS |
| Transaction Info | Block #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 @feliperce2026/04/25 23:36:54
steemdelegated 4.890 SP to @feliperce
2026/04/25 23:36:54
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 7952.001686 VESTS |
| Transaction Info | Block #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 @feliperce2026/01/23 07:50:21
steemdelegated 3.240 SP to @feliperce
2026/01/23 07:50:21
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 5268.822344 VESTS |
| Transaction Info | Block #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 @feliperce2024/12/17 03:09:30
steemdelegated 3.341 SP to @feliperce
2024/12/17 03:09:30
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 5433.041541 VESTS |
| Transaction Info | Block #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 @feliperce2023/11/13 18:52:12
steemdelegated 3.445 SP to @feliperce
2023/11/13 18:52:12
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 5602.175073 VESTS |
| Transaction Info | Block #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 @feliperce2023/09/21 21:50:39
steemdelegated 5.251 SP to @feliperce
2023/09/21 21:50:39
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 8539.453859 VESTS |
| Transaction Info | Block #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 @feliperce2022/11/03 11:38:21
steemdelegated 5.387 SP to @feliperce
2022/11/03 11:38:21
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 8761.135297 VESTS |
| Transaction Info | Block #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 @feliperce2022/01/17 10:54:36
steemdelegated 5.523 SP to @feliperce
2022/01/17 10:54:36
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 8981.668528 VESTS |
| Transaction Info | Block #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 @feliperce2021/06/14 00:49:54
steemdelegated 5.636 SP to @feliperce
2021/06/14 00:49:54
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9165.437186 VESTS |
| Transaction Info | Block #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 @feliperce2020/12/11 11:08:30
steemdelegated 5.751 SP to @feliperce
2020/12/11 11:08:30
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9352.859160 VESTS |
| Transaction Info | Block #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 @feliperce2020/12/06 04:45:51
steemdelegated 1.176 SP to @feliperce
2020/12/06 04:45:51
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #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 @feliperce2020/12/05 14:46:42
steemdelegated 5.755 SP to @feliperce
2020/12/05 14:46:42
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9359.067014 VESTS |
| Transaction Info | Block #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 @feliperce2020/11/02 15:40:57
steemdelegated 1.181 SP to @feliperce
2020/11/02 15:40:57
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #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 @feliperce2020/05/09 05:43:06
steemdelegated 5.880 SP to @feliperce
2020/05/09 05:43:06
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9561.872373 VESTS |
| Transaction Info | Block #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 @feliperce2020/05/08 09:19:21
steemdelegated 1.201 SP to @feliperce
2020/05/08 09:19:21
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #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
2020/03/13 03:47:48
| 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! <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/"></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 Info | Block #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/\"></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 @feliperce2019/11/01 07:38:15
steemdelegated 5.945 SP to @feliperce
2019/11/01 07:38:15
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9668.271456 VESTS |
| Transaction Info | Block #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
2019/03/13 13:56:03
| 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! <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 Info | Block #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 @feliperce2018/11/26 17:29:54
steemdelegated 6.066 SP to @feliperce
2018/11/26 17:29:54
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9865.746833 VESTS |
| Transaction Info | Block #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 @feliperce2018/10/19 06:37:09
steemdelegated 18.489 SP to @feliperce
2018/10/19 06:37:09
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 30068.530437 VESTS |
| Transaction Info | Block #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"
}
]
}felipercefollowed @sweetsssj2018/10/19 05:54:36
felipercefollowed @sweetsssj
2018/10/19 05:54:36
| required auths | [] |
| required posting auths | ["feliperce"] |
| id | follow |
| json | ["follow",{"follower":"feliperce","following":"sweetsssj","what":["blog"]}] |
| Transaction Info | Block #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 @feliperce2018/10/15 12:17:18
steemdelegated 6.081 SP to @feliperce
2018/10/15 12:17:18
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9888.773529 VESTS |
| Transaction Info | Block #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"
}
]
}feliperceunfollowed @fastresteem2018/07/16 12:04:00
feliperceunfollowed @fastresteem
2018/07/16 12:04:00
| required auths | [] |
| required posting auths | ["feliperce"] |
| id | follow |
| json | ["follow",{"follower":"feliperce","following":"fastresteem","what":[]}] |
| Transaction Info | Block #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\":[]}]"
}
]
}feliperceupvoted (100.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/07 05:01:42
feliperceupvoted (100.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/07 05:01:42
| voter | feliperce |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
2018/07/02 08:34:36
| 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) : [](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 Info | Block #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[](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\"]}"
}
]
}felipercepublished a new post: programando-em-kotlin-para-javascript2018/07/02 06:32:24
felipercepublished a new post: programando-em-kotlin-para-javascript
2018/07/02 06:32:24
| 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. ## 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></center> Observe que uma lib foi adicionada. <center></center> * Agora crie um arquivo html com nome "index" <center></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></center> O arquivo .js especificado no index.html será gerado na pasta out/ <center></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></center> </br> <center></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></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></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></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></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`:  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 Info | Block #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": "\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></center>\n\nObserve que uma lib foi adicionada.\n\n<center></center>\n\n* Agora crie um arquivo html com nome \"index\" \n\n<center></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></center>\n\nO arquivo .js especificado no index.html será gerado na pasta out/\n\n<center></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></center>\n</br>\n\n<center></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></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></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></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></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\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 @feliperce2018/07/02 00:03:54
steemdelegated 18.597 SP to @feliperce
2018/07/02 00:03:54
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 30244.637467 VESTS |
| Transaction Info | Block #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"
}
]
}felipercefollowed @fastresteem2018/07/01 23:48:48
felipercefollowed @fastresteem
2018/07/01 23:48:48
| required auths | [] |
| required posting auths | ["feliperce"] |
| id | follow |
| json | ["follow",{"follower":"feliperce","following":"fastresteem","what":["blog"]}] |
| Transaction Info | Block #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\"]}]"
}
]
}yeheyupvoted (10.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 23:03:15
yeheyupvoted (10.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 23:03:15
| voter | yehey |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 1000 (10.00%) |
| Transaction Info | Block #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
}
]
}acknowledgementupvoted (10.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 23:01:27
acknowledgementupvoted (10.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 23:01:27
| voter | acknowledgement |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 1000 (10.00%) |
| Transaction Info | Block #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
}
]
}alphabotupvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 22:55:00
alphabotupvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 22:55:00
| voter | alphabot |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}felipercepublished a new post: programando-em-kotlin-para-javascript2018/07/01 22:54:48
felipercepublished a new post: programando-em-kotlin-para-javascript
2018/07/01 22:54:48
| parent author | |
| parent permlink | kotlin |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| title | Programando 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 Info | Block #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\"}"
}
]
}fastresteemupvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 22:36:15
fastresteemupvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 22:36:15
| voter | fastresteem |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}felipercepublished a new post: programando-em-kotlin-para-javascript2018/07/01 22:36:03
felipercepublished a new post: programando-em-kotlin-para-javascript
2018/07/01 22:36:03
| parent author | |
| parent permlink | kotlin |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| title | Programando 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 Info | Block #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\"}"
}
]
}sudenazupvoted (100.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 22:26:12
sudenazupvoted (100.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 22:26:12
| voter | sudenaz |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}ax3upvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript2018/07/01 22:25:00
ax3upvoted (1.00%) @feliperce / programando-em-kotlin-para-javascript
2018/07/01 22:25:00
| voter | ax3 |
| author | feliperce |
| permlink | programando-em-kotlin-para-javascript |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}felipercepublished a new post: programando-em-kotlin-para-javascript2018/07/01 22:24:48
felipercepublished a new post: programando-em-kotlin-para-javascript
2018/07/01 22:24:48
| 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. ## 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></center> Note que uma lib foi adicionada. <center></center> 2. Agora crie um arquivo html com nome "index" <center></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></center> O arquivo .js especificado no index.html será gerado na pasta out/ <center></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></center> </br> <center></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></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></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></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></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`:  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 Info | Block #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></center>\n\nNote que uma lib foi adicionada.\n\n<center></center>\n\n2. Agora crie um arquivo html com nome \"index\" \n\n<center></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></center>\n\nO arquivo .js especificado no index.html será gerado na pasta out/\n\n<center></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></center>\n</br>\n\n<center></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></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></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></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></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\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 @feliperce2018/06/30 07:49:36
steemdelegated 6.116 SP to @feliperce
2018/06/30 07:49:36
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 9946.335147 VESTS |
| Transaction Info | Block #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
2018/03/31 06:41:30
| required auths | [] |
| required posting auths | ["feliperce"] |
| id | follow |
| json | ["follow",{"follower":"feliperce","following":"paratii","what":["blog"]}] |
| Transaction Info | Block #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-room2018/03/20 03:20:39
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
| 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 |
| Transaction Info | Block #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
2018/03/18 19:30:03
| 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"} |
| Transaction Info | Block #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
2018/03/18 19:18:03
| 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 | |
| Transaction Info | Block #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": ""
}
]
}feliperceupvoted (100.00%) @nathantemi / most-amazing-and-adventurous-cave-of-the-universe2018/03/18 19:17:33
feliperceupvoted (100.00%) @nathantemi / most-amazing-and-adventurous-cave-of-the-universe
2018/03/18 19:17:33
| voter | feliperce |
| author | nathantemi |
| permlink | most-amazing-and-adventurous-cave-of-the-universe |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
2018/03/18 19:17:00
| 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"} |
| Transaction Info | Block #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\"}"
}
]
}feliperceupvoted (100.00%) @feliperce / descentralizacao-e-o-futuro2018/03/18 19:15:21
feliperceupvoted (100.00%) @feliperce / descentralizacao-e-o-futuro
2018/03/18 19:15:21
| voter | feliperce |
| author | feliperce |
| permlink | descentralizacao-e-o-futuro |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}felipercepublished a new post: descentralizacao-e-o-futuro2018/03/18 19:15:21
felipercepublished a new post: descentralizacao-e-o-futuro
2018/03/18 19:15:21
| parent author | |
| parent permlink | cryptomoeda |
| author | feliperce |
| permlink | descentralizacao-e-o-futuro |
| title | Descentralização é o futuro |
| body |  > 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  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](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](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  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  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  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  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 Info | Block #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": "\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\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\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\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\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\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\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\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\"}"
}
]
}nadezdalebedevaupvoted (100.00%) @feliperce / introducao-a-persistencia-de-dados-com-room2018/03/13 13:53:39
nadezdalebedevaupvoted (100.00%) @feliperce / introducao-a-persistencia-de-dados-com-room
2018/03/13 13:53:39
| voter | nadezdalebedeva |
| author | feliperce |
| permlink | introducao-a-persistencia-de-dados-com-room |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}hr1upvoted (0.02%) @feliperce / introducao-a-persistencia-de-dados-com-room2018/03/13 03:50:33
hr1upvoted (0.02%) @feliperce / introducao-a-persistencia-de-dados-com-room
2018/03/13 03:50:33
| voter | hr1 |
| author | feliperce |
| permlink | introducao-a-persistencia-de-dados-com-room |
| weight | 2 (0.02%) |
| Transaction Info | Block #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
}
]
}feliperceupvoted (100.00%) @feliperce / introducao-a-persistencia-de-dados-com-room2018/03/13 03:20:39
feliperceupvoted (100.00%) @feliperce / introducao-a-persistencia-de-dados-com-room
2018/03/13 03:20:39
| voter | feliperce |
| author | feliperce |
| permlink | introducao-a-persistencia-de-dados-com-room |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}felipercepublished a new post: introducao-a-persistencia-de-dados-com-room2018/03/13 03:20:39
felipercepublished a new post: introducao-a-persistencia-de-dados-com-room
2018/03/13 03:20:39
| 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 |  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.  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 Info | Block #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": "\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\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 properties2018/03/13 03:12:42
feliperceupdated their account properties
2018/03/13 03:12:42
| 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"}} |
| Transaction Info | Block #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 @feliperce2018/03/13 03:08:54
steemdelegated 18.706 SP to @feliperce
2018/03/13 03:08:54
| delegator | steem |
| delegatee | feliperce |
| vesting shares | 30421.890271 VESTS |
| Transaction Info | Block #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: @feliperce2018/03/13 02:47:06
steemcreated a new account: @feliperce
2018/03/13 02:47:06
| 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 | [] |
| Transaction Info | Block #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": []
}
]
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779063360
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779063360
},
"rc_account": {
"account": "feliperce",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779063360
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}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.
[]