為さねば成らぬ

retia.verno@gmail.com

Format /topics/topic-name is deprecated. Only 'topic-name' should be used in subscribeToTopic.

Logcatに出るメッセージ。 FirebaseMessaging.subscribeToTopic/unsubscribeFromTopicのトピック名に/topics/ のprefixをつけるなということらしい。 ちなみにこれらメソッドの頭で

   public Task<Void> subscribeToTopic(String var1) {
        if (var1 != null && var1.startsWith("/topics/")) {
            Log.w("FirebaseMessaging", "Format /topics/topic-name is deprecated. Only 'topic-name' should be used in subscribeToTopic.");
            var1 = var1.substring(8);
        }

なので、 /topics/ を外しても挙動に変わりはなし。

PxViewer開発終了のお知らせ

長らく開発を続けていたPxViewerですが、本日サポート終了することを決定いたしました。

なんで?

ログインできないというお問い合わせをいただいておりましたが、pixivのログインのロジックが変更になりその修正が難しくなったためです。

この変更ではpixivのWebログインにreCAPTCHA v3が導入されていました。PxViewerではアプリ側でスクレイピングを行いデータを取得していましたが、この方法ではJavascriptを実行する必要があるreCAPTCHA v3を突破するのは難しいと判断しました。

他に方法はないの?

Play Storeを見ると今でもサードパーティのpixivアプリが存在しています。 おそらくですが、これらはPxViewerとは異なり、pixiv公式アプリで使われているAPIを利用していると考えられます。 これらのAPIを使えばPxViewerでも今まで通りの機能を提供できるかもしれませんが、アプリの大部分を書き換えなければなりません。

そもそも最近では機能開発できておらず、使えなくなるレベルの構造変化があった時のみ直すという対応でした。 今回のpixiv側の変更はセキュリティ強化であり、今後もこのような変更やスクレイピングが困難になることが予想され、 ここらが潮時だろう、と考えました。

終わりに

Androidが出て比較的初期の方にリリースすることができ、多くの方々に使用していただきました。 第一目的は自分が使いやすいものを作る、でしたが競合が少ないので多くのユーザーを獲得できるのではという打算的な面もありました。

Twitterなどから頂く声、要望、カンパ、どれも非常に開発の励みになりました。

Google Play Storeに載せられなくなり野良アプリになってからも、ユーザー数がそこまで落ちないことに驚きました。 笑ったのは中国語対応した改造版を作ってまで使っていただいたことでした。

今までご利用いただき、本当にありがとうございました!!

[GW] エンジニアリング組織論への招待 1,2章

目次から

人間の脳内の話っぽい。 気になるのは

  • 論理的思考の盲点
    • 論理的思考は基本となるけどそこにはどう突っ込むのだろう
  • 不確実性と夏休みの宿題
  • 問題の解決よりも問題の明晰化の方が難しい
    • エンジニアの仕事は問題解決というけれど、問題を見つけるのが難しいよなぁとは思ってた

メモ

  • 理不尽や感情の対立は人間の思考の中にバグが含まれているような状態
  • エンジニアリングとは一体なんなのか
    • 何か役に立つものを実現していく学問
    • 曖昧さを減らし具体性・明確さを増やす行為
    • どうしたら効率よく不確実性を減らしていけるのかが重要
  • 不確実性=エントロピー
    • 確率が偏っているほど不確実性の量は減っていく
    • 不確実性の量の差が「情報」
    • 不確実性を減らす = 情報を生み出す
  • 無意識にわからないものに向き合うことを避けてしまう習性がある。それが不安
    • めっちゃわかる
  • 論理的思考の盲点
    • 人が介在することで感情的にどうしてもなってしまう部分がある
    • 自分・人が論理的でなくなる場面を知った上で問題解決に挑む
  • 3つの思考
    • 論理的思考の盲点
    • 経験主義と仮説思考 -システム思考
      • 正解を自分で設定する
  • 仕事の問題を学力テストに置き換える
    • 変換できれば簡単なはず
    • 難しいというのは正しく変換できていない
      • どういう問題で
      • どういうのが正解なのか
      • が明確になっていない
  • 人間が正しく論理的に思考するためには
    • 認識が歪む場面を知り、事実を正しく認知する
  • 4つのイドラ(錯覚や認識の間違い)
    • 種族のイドラ
      • 人間が本来持っている性質から生じるもの
      • 遠くにあるものが小さく見えるとか
    • 洞窟のイドラ
      • 外の世界を知らずに一般的なことだと決めつけて理解することから生じる
      • 自分がそうだから他の人もそう,とか
    • 市場のイドラ
      • 言葉の不適切な使用から生じる
      • 噂話やデマ
    • 劇場のイオラ
      • 伝統や権威を無批判に受け入れてしまう
      • 偉い人の言っていることは正しい
  • 認知の歪み
    • ゼロイチ思考
    • 一般化のしすぎ
    • すべき思考
    • 選択的注目
      • 人は見ないものしか見ない
    • レッテル貼
    • 結論の飛躍
      • 既読スルーを嫌われたと感じてしまう
    • 感情の理由づけ
  • 認知的不協和の論理
    • 自分の感情や行動の矛盾を解決するために認知を歪めること
  • 怒りが発生している時は「自分」「自分の大切にしているもの」に被害が及びそうだと感じている
    • 何が大事なのかを知る機会になる
  • 被害が及びそうな時に本能的に怒るのではなく、悲しみとして伝える
  • 問題解決より問題認知の方が難しい
    • 認知の歪みがあるから、正しく認知することが難しいということ
  • 経験主義は、わからないを行動に変換し、一歩でも正解にたどり着くための思考の補助線
  • プロフェッショナルであればあるほど、不確実性を最初きに下げていることを心がける
  • 経験主義とは単にやってみなければわからない、というものではない
    • 知識=経験を行動によって手に入れる
    • 行動できることは何か/行動の結果起きたことを観察できるか
  • 他人のスキルや考えは観察できない= コントロールできない
    • 他人の行動は観察できる
  • コントロールできるものを操作し、観測できるものの結果を見て、物事を前に進める
  • 仮説思考
    • 演繹的・帰納的には導くことができない、直感や閃きによって生まれる跳躍
  • 不確実性が高いプロジェクトには、仮説が検証できるまで大きな投資はしない

    1-6

  • ビジネス全体の関係は、資産をビジネスモデルに変換し、増加した資産でさらにビジネスモデルに投資するというフィードバックサイクルのシステム
  • 仕事において、どのようなフィードバックサイクルが存在するのかを見つけていくことが重要な考え方
  • 同じ目的を持つ人同士が提案で対立している時は、それぞれが見ているものが違う可能性がある。一つ上からシステム的に、全体的に見る必要がありそう
  • 視野・視座・視点が問題解決のための眼になる
    • 視野 広い狭い
      • ある問題はある大きな問題に包含されていて〜的な
    • 視座 (=だいたい、会社でどの立場で問題を考えるか) 高い低い
      • 高すぎても抽象的になるし低すぎてもミクロになる
    • 視点 鋭い・凡庸
  • 対立に見える問題を、対立にならない全体像をあぶり出すことと、その解決を個人の問題でなく関係性の問題に変換して問題を発見すること

1-7

  • 組織における理不尽の増幅
    • 情報の非対称性
      • 情報伝達が不完全なことに、害意や悪意を感じてしまいがち(ハンロンのカミソリ)
    • 限定合理性
      • それぞれが合理的な行動をとったとしても全体で不合理になってしまう
  • 情報の透明性
    • 情報を公開するだけでない
    • 必要な情報が正しく伝達されるように努力し、何かわからない決定があってもそれは聞いてみようという関係性を作ること

2-1

  • コードレビュー
    • 「自分はこっちの方がこういう理由で良いと思うけど」
  • 自立型人材
    • 今より良い状態にするためにどうしたらよいか
    • 自分自身の思考の範囲を狭めた世界で考えることが心地よくなってしまう
  • HRT (謙虚、経緯、信頼)
    • 上司部下では難しい
    • メンティが自尊心高くても難しい
  • メンターとピアメンター
    • メンター
    • ピアメンター
      • 尊敬できるとまではいかないが数年上の先輩
    • 課題を指摘するのではなく、課題に一緒に向きあい成長を支援する
  • 成長の階段
    • 階段を認識させる
      • 「階段があるよ」ではなく「足元は大丈夫?」
    • 梯子をかけてあげる
    • 階段を登りたくさせる
  • 自己説得
    • 質問を投げかけることで自分で気づかせる
  • 悩む
    • どのように考えれば良いかを指し示して、次の行動を促す
    • メンティが「行動できていない時」に、メンターは「悩み」を聞き出し、気づきを促して「考える」に変える必要がある

2-2

  • 「問題を解決してあげよう」ではなく「モヤモヤしていない問題」に変換してあげよう
    • モヤモヤしていない問題=明確に次にすべき行動がわかる
  • 傾聴で「相手のコップを空にする」
  • 傾聴
    • 「相手の」感情への共感を言動で表す
    • 「相手の」話の内容を「可視化」する
    • 「相手の」思考の「盲点」を探索しながら質問をする
  • 話を聞くのが上手い人は「相手のそばに立って話を聞いている」という言外の信号を常に送っている
    • しぐさ・うなずき・座り方
      • スマホいじりながらとかx
      • 真正面は緊張する
    • 表情
    • あいづち
      • 感情的な表現をした時、感情に関わる箇所のみをリピートする
  • 問題の可視化
    • ホワイトボード・ノートに書き出したり、ものを配置することで第三者目線になる
    • 同じ感情を繰り返す時は「〜が不安」とホワイトボードに書いてしまう
  • 悩んでいるという状態は次が不明確
    • 選択肢
    • 比較軸
    • 評価方法
  • 認知フレームを発見するワード
    • こちら系
      • 同じ側にいるように思われるが自分は同じではないと感じる
    • あちら系
      • 自分達と大きく同じくくりにいるはずなのに自分達とは明確に違う
    • 極端系
      • 0/1で認知している
    • すべき系
      • すべきという思考の枠組みの中で考えようとしている
    • 決めつけ系(どうせ、違いない)
  • 前提の確認と取り外し
    • 問題視している点具体的に聞く,解決策の束縛条件を聞く
    • その上で、その前提がなかったらどうだろう?と質問する
    • 前提の優先順位を問う
  • 課題の分離
    • あなたにとって具体的に何が問題か
    • あなたがコントロールできるものは何か
    • どうなればその具体的な問題は解消されたといえるのか
  • メンターはメンティの問題を自分の課題として捉えてはいけない

    2-3

    1on1では心理的安全性を下げることが大事なんだな

  • ラーニングゾーン
    • 対人リスクを適切にとって、問題と自分達という構図が生まれている状態
  • ストーリーテリング能力
    • メンターとして、「ダメで失敗もしたけれど、そこからこういうことを学んで、こんな風にしたら、うまくいって成長できた」
  • アクノレッジメント
    • 存在承認
      • あいさつ、前に行っていたことを覚えている、様子を見て肩を叩いて励ます
    • 行動承認
      • ポジティブな行動をそのまま伝えてあげる
    • 結果承認
      • 出来上がったものについて感想を言う、褒めるも含まれる
  • メンターからメンティーにフィードバックを求める = 承認
  • 当たり前のことを意識してやる
    • ちゃんと挨拶する
    • 無視しないで話を聞く
    • 相手に感謝を伝える
    • 気にかけて話しかける
    • 自分本位でなく相手本位で話をする
  • ストーリーテリング
    • 自慢話にならないように
    • 悩みと、その解消までの過程を話す
    • その時の感情を自己開示
  • ジョハリの窓
    • 開放の窓を広げる
    • 「他人はわかっていない」には自己開示
    • 「自分はわかっていない」にはフィードバック

      2-4

  • SMART
    • Specific/Measureable/Achievable/Related/Time-Bound
    • メンターとメンティで次の行動を合意する時満たしているか確認する
  • わかった?は聞かない
    • 試しに一人でやってみて・代わりに自分の言葉で説明してみて
  • 能力は習慣の積分、習慣は行動の積分
  • ある行動・習慣が取れない時
    • 行動を促進する力を行動を阻害する力が上回っている
    • 促進する力の要因には、フィードバック機会を増やし適切に承認する
    • 阻害する力の要因には、環境や構造を変えるための行動をする
  • ゴールへのTime Machine
    • 高いゴールを持ち、その「未来」から見て、現在から未来までの道筋が見える状態

[GW] エンジニアリング組織論への招待

動機

GW中に読むぞ!!!

エンジニアリング以外にマネジメント的な部分も求められるようになり勧められたので。 1日1章ずつはこなしていきたい。

目次を見て

脳内->人->チーム->チーム->組織 と、だんだん範囲が広がっていってるのがわかる。 目次から気になった章を上げていく。

  • 不確実性
    • タスクの見積もりの不確実性に悩んでいる
  • 問題解決より問題認知の方が難しい
  • メンタリング
    • 一番気になってるところ
  • なぜ行動を起こせないのか
  • アジャイル
    • 趣味では個人開発、前職はインフラ、現職はチームだけどほぼ1人で回しているためアジャイルをちゃんと勉強してこなかった。
  • 技術組織の力学とアーキテクチャ
    • 社のエンジニア組織を考えるようになったので多分いちばん効きそうなやつ

ほめる技術

買った動機

社会人歴も長く、自分の技術だけを見てもいられなくなってきた感。 先日も評価というほどではないが同僚の最近の仕事を言語化して引き出すようなことをやっていて、全然うまくできなかったこともあり、 どういうところにほめるポイントを見いだせるのかを知りたかった。

今後行動しやすいようにまとめる。

4つのタイプ

人は4つのタイプに分けられる

  • コントローラー
    • 行動的で、自分が思った通りに物事を進めることを好む
    • こちらの話が少しでも長くなると、多少のいらつきが顔に現れ、先を急がせようとする
  • プロモーター
    • 自分のオリジナルなアイデアを大切にし、人と人気あることをすることを好む
    • よく話す。話の展開が早い。
  • サポーター
    • 人を援助することを好み、協力関係を大事にするタイプ
    • いわゆるいい人。話を傾聴してくれ、質問に対し正しい回答を返そうとする
  • アナライザー
    • 行動の前に多くの情報を集め、計画を立てるタイプ
    • 話をするときは慎重に言葉を選ぶ

そしてタイプ別に効果的なアクノレッジメントがある。

  • コントローラー
    • ほめすぎはコントロールしようとしているのではないか、と疑われる
    • その人自身ではなく、チームのメンバーの働きや雰囲気をアクノレッジする
    • その人が決めた目標を達成した瞬間にニュートラルにアクノレッジする
    • 「きついこと」(欠点)を単刀直入に伝える
  • プロモーター
    • とにかくお世辞でもいいから褒めまくる
  • サポーター
    • 自分のした仕事に対して無意識に相手に代償を求める
    • 仕事を振ったらどんな小さいことでもアクノレッジする
  • アナライザー
    • 具体的にどの部分が良かったのかを明示する

相手にあったコミュニケーション

  • 若い人
    • 単に命令するだけでなく理由も伝える
  • 新しい部下
    • その人への期待と不安を正直に伝える
  • 年上の部下
    • なるべく「相談」する
  • 上司

メモ

以下メモしたポイント。

Youのスタンスから〜つまり、あなたの行為、存在はこのように素晴らしいと相手に伝えることです。
〜
Iで承認するというのは、相手位の行為、あるいは存在そのものが、自分に対してどのような影響を与えているのかを言葉にして伝えることを指します。

これは自分にとっては結構楽になる。 自分は適当なことは言いたく無い(本書でのアナライザータイプ)だから、Youのスタンスで褒めるとしても相手をちゃんと知らなければいけないとなかなか伝えられない。 Iで承認するのであれば、自分の本当の心からの言葉なので紡ぎだしやすい。 出てこない場合は…そもそもそういう人は褒める場面ではなさそう。

一方的なアドバイスにはアクノレッジメントがありません
〜
教えたい、自分にはそれだけの知識があることを誇示したいという、アドバイスする側のニーズを満たしているに過ぎないことが多いのです。

知識の顕示欲はめっちゃある。 僕はこう思うけれども、君はどう思う?と問いかける。

向こうが投げたボールに対して、そのボールをすぐに返す、というのは相手に対するアクノレッジメントとなります。

返信めっちゃ遅い癖どうにか直したい。。。

だからこそ頻繁に伝えましょう。「今こうしているね」と。

相手を穴があくほど観察して、みたまま聞いたまま伝えてあげるだけ。

意見を求めるというのは、その相手に対する大きなアクノレッジメントです。

インターン生がきた時とか。もっと聞いてみてもよい。

そこにはゲストを大切にしようというウィルがあります。
だからこそ毎回の挨拶がアクノレッジメントになるのです。

挨拶一つ取っても、自分から行う(=ウィル)ものなのか、ひとからやらされるものなのか。

人心掌握に長けた人はこの別れ際の一言がものすごく上手いのです。
すきあらば人のアクノレッジメントをしようと思って行きている人と、いつ自分はアクノレッジメントされるんだろうとずっと待ってる人と

自分は後者。基本沈黙を選びがちで、アクノレッジするのもされるのも無いことを前提をしている。 それでもされるとやはり嬉しいので、後者を選んでいるということだろう。

Android 9でWebViewでhttpのページがひらけない

背景

アプリ内で(まだ!)WebViewを使って簡易ブラウジングを行える部分がある。 URLをアプリで取り扱う時、基本的に次の3つがある

  • WebView
  • Chrome Custom Tab
  • Intentで外部に投げる

intentで投げると自アプリから離脱することになるのでやりたくない。 またChromeCustomTabも、セキュリティなどの面から本当は使いたいが、Javascriptでのコールバックをアプリで受け取りたいのでそれも無理。 ということでWebViewを使っている。

課題

手元のOne Plus 6で触っていたら生きているはずのURLでエラーが出る。 結果として、Android 9だとhttp通信をデフォルトでは許可しなくなっているらしい。 android-developers.googleblog.com

これを許可するための設定が cleartextTrafficPermittedである。 networkSecurityConfigにドメインごとの設定を書く。

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>

または、AndroidManifestに設定をする。 この場合全開放になるため注意が必要。

<application
    ....
    android:usesCleartextTraffic="true"
    ....>

最終的に、セキュリティ上の懸念点からこれらの設定を行わず、intentで開くようにした。

List.equals()

Listのequalsについて。 なんとなく勘違いしていて、比較するリストの型が違う時、中身の要素が同じでもfalseになると思ってた。

というのも、Listの子クラスを使って型として情報を持たせたく、その上で要素を比較したい要件があったため。 別クラスのListの比較は、equalsでfalse返しそうだからいい比較方法ないかなーと思ったら普通にequalsで大丈夫でした。

android.googlesource.com