ここに全部URLのせてみんなに見てもらえば?
多分そう、もっとしたいんだと思う。
俺が付き合いはじめより抱かなくなったり、、淡白になってるのでめちゃくちゃ傷ついている。
俺もクスリ飲んだりするけど、勃たない。
朝勃ちを利用して抱いたりするけど、中折する。
毎週来てたのが間隔開くようになってきた。
めちゃくちゃ傷つけてる
そもそもな、黒人歌手の動きをアジア人が面白おかしく物まねする芸の差別性が分かるか?
あれは太った渡辺が笑われてるんじゃない。
文化を盗んだ。
ただ、渡辺は佐々木を批判するだけでなく、自分自身が過去にやってきた差別的な言動についても謝罪し、筋を通した。
二度とやることはないだろう。
顔もカッコよくないし、仕事も自営の適当な感じなんで相手にされない🙄
ただ、そんな過去を考えると、彼女はそんな俺の事好きって言ってくれる希有な女性である。おなら目の前でしても笑って許してくれる。
女が稼ごうとしないからな。
イラクでテロリストに殺害された福岡県出身の若者に対して、すでにその事実が明らかになった後で、彼に対して辛辣な自己責任論を振りかざし、いわば「死人に鞭打つ」行為を平然とやってのけたある日のコラムが未だにどうしても忘れられない。
この出来事は、私にとっては衝撃的で、政府の腰巾着となっている一部マスコミへの不信を決定的なものにした。
既にもう15年以上が経っている。
権力者に便乗した優越的な地位に立つ者の醜悪さ傲慢さと残忍さ(とても残念などと言えるレベルではない!)をこれほどまでにまざまざと見せつけられた経験は非常にまれだ。
2021年はWebサービスを10本はリリースすると心に決めた。
WebScoketを使った簡易的な対戦ブラウザゲームに、半分自分用に作った勉強アプリ等など
小ネタみたいなのも多いけどもう4個くらいはもうリリースしてる
多分転職活動で使うポートフォリオとしてはめちゃくちゃ十分なものができたと思う。
でもまあ今の所それ以上にはなってない。
作っては見たものの適当な掲示板で宣伝して1日だけ数十アクセスきてそれで終了とか、ユーザー投稿型サービスなのに1投稿もされずに終わることも結構あった。
今は面白くないとか使いにくいとかそういうジャッジをされる前段階で終わってる。
30分書いて投稿したネタ増田が1ブクマも1トラバもつかなくてちょっと悲しくなることってあるじゃない?
多分マネタイズみたいな意味だとYoutubeで人気Youtuberの配信切り抜き作ったりいかがでしたブログでも作った方がよっぽど確実でコスパも良いんだと思う。
勉強コストはアプリ開発より低いし、SEOを最適化するようなナレッジも多いし、単価高めの広告も付きやすい。
そろそろ心が折れそうなのだが、このまま自分はプログラマーとして今年の目標を遂行すべきなのだろうか……
Webサービスって手間かかる割に人が使わなきゃ自分にも他人にも一切役に立たない本当にただのゴミだと思う。
次を作るよりこの終わる問題を解決しないと心が持ちそうにない。
男女の賃金格差ってそんな縮まってないけど
7と8。
技術的なところが気になる人はこれだけ読んでくれたらいい
最後に技術的な観点からエアレペルソナが純国産ではないということを指摘する。
RocketChatという海外で開発されたOSSチャットアプリをフォーク、改変したもののよう。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative
ttps://rocket.chat
フォーク元はバリバリ多国籍、外資である。(RocketChat自体は問題のないアプリであり、このエアレペルソナとはフォーク関係を超える関係はないと思われる)
冒頭のこの部分に関してである。
ttps://play.google.com/store/apps/details?id=chat.airlex.reactnative
Google Playで公開されているエアレペルソナのAndroidアプリをリバースエンジニアリングして調べてみた。
ちなみに、エアレペルソナには利用規約のようなものは見当たらず、リバースエンジニアリング禁止条項も無いようだった。
ttps://apps.evozi.com/apk-downloader/
ttps://github.com/pxb1988/dex2jar
この辺を使ってapkをダウンロードし、apkを解凍し、chat.airlex.reactnative/classes.dexをjar fileに変換した。
classes.dexから変換されたjarファイルを展開するとchat/airlex/reactnativeというフォルダ、パッケージが見つかる。
このパッケージ内のファイル(.class、クラス)がエアレペルソナの処理を行うもののようである。
このクラスをJadを使い、デコンパイルしてみた。その結果が以下である。
ちなみにここからapkをアップロードするとdex2jarをしなくてもJavaのソースコードにまでデコンパイルしてくれた。便利。
package chat.airlex.reactnative; import android.content.Context; import com.ammarahmed.mmkv.SecureKeystore; import com.facebook.react.bridge.ReactApplicationContext; import com.tencent.mmkv.MMKV; public class Ejson { private String TOKEN_KEY = "reactnativemeteor_usertoken-"; String cardId; String host; String messageId; String messageType; /* access modifiers changed from: private */ public MMKV mmkv; String msg; String notificationType; String rid; Sender sender; String senderName; String type; public Ejson() { ReactApplicationContext reactApplicationContext = CustomPushNotification.reactApplicationContext; if (reactApplicationContext != null) { MMKV.initialize((Context) reactApplicationContext); new SecureKeystore(reactApplicationContext).getSecureKey(C0617Utils.toHex("com.MMKV.default"), new RNCallback() { public void invoke(Object... objArr) { if (objArr[0] == null) { MMKV unused = Ejson.this.mmkv = MMKV.mmkvWithID("default", 1, objArr[1]); } } }); } } public String getAvatarUri() { if (this.type == null) { return null; } return serverURL() + "/avatar/" + this.sender._id + "?rc_token=" + token() + "&rc_uid=" + userId(); } public String token() { String userId = userId(); MMKV mmkv2 = this.mmkv; return (mmkv2 == null || userId == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(userId)); } public String userId() { String serverURL = serverURL(); MMKV mmkv2 = this.mmkv; return (mmkv2 == null || serverURL == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(serverURL)); } public String privateKey() { String serverURL = serverURL(); MMKV mmkv2 = this.mmkv; if (mmkv2 == null || serverURL == null) { return null; } return mmkv2.decodeString(serverURL.concat("-RC_E2E_PRIVATE_KEY")); } public String serverURL() { String str = this.host; return (str == null || !str.endsWith("/")) ? str : str.substring(0, str.length() - 1); } public class Sender { String _id; String username; public Sender() { } } }
フィールド名を見てみると、cardId, host, messageId, messageType, mmkv, msg, notificationType, rid, sender, senderName, typeが存在する。
メソッドには、getAvaterUri、token、userId、privateKey、severURLが存在する。
ところで、RocketChatというOSSのチャットアプリが存在する。
ttps://rocket.chat
そのRoketChatのAndroid実装の中に同名のEjsonというクラスが存在する。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative
ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/android/app/src/play/java/chat/rocket/reactnative/Ejson.java
見比べてみると、フィールドにcardIdが追加されている以外はフィールドやメソッド名、そしてその処理の内容まで一致している。
他にもReplyBroadcastなど、同様のクラスがエアレペルソナに見つかる。
以上のことからエアレペルソナはRocketChatをフォークして、パッケージ名を変えて作られたチャットアプリであり、開発の大部分はRocketChat社の努力と多数のOSSコントリビュータによってなされたものであると思われる。
そもそもこのOSS時代に純だの何だの言っている時点で怪しい。
さて、エアレペルソナがRocketChatをフォークして作られたものであるとすると、気になるのはライセンスである。
RocketChatのOSSライセンスはMITライセンスである。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/LICENSE
MITライセンスは非常に緩いライセンスであるため、エアレペルソナの様にフォークして別のアプリケーションとして公開することにはおそらく問題がないということは強調しておく。
現状エアレペルソナにログインできておらず(2要素認証のコードが送信されないといった問題が起きている模様)、使用している各OSSのライセンス表示が適切に行われているかまでは調べられていない。
そんなことどこも書いてないから卑屈なんだよなぁ