Think Essentially

計算機テクノロジー全般が好きです

intel MPKが搭載されているCPUを調べる

はじめに

研究でintel MPKが搭載されたCPU購入するうえで、どのCPUにMPKが搭載されているのか判別する方法を調べました。

現在の開発環境に含まれるか調べる

Linux環境の場合、

lscpu | grep pku 

もしくは

cat /proc/cpu | grep pku 

でflagにpkuが含まれば、intel MPKが搭載されています。

ドキュメントから調べる

CPUを購入する際に、本当にPKRUが含まれるか?を調べるときは GCCが提供しているドキュメントのx86オプションが最も信憑性が高そうです。

先述項目と同様に、該当のアーキテクチャに pkuフラグが記載されていれば、intel MPKが搭載されていると判断して良さそうです。

gcc.gnu.org

【技術書】世界一流エンジニアの思考法【感想】

感想

思考法に共通することは「必要最低限の労力で最大の成果を生み出す」ということ。この考え方はエッセンシャル思考に似ていると感じた。人間の注意資源と時間は限られているので、改めて効率的に行動することが大切なんだなと感じた。

目から鱗ポイント

  • コードを全て理解しようと考えない、局所を見て大局を掴む
  • 失敗は笑いながら話せ
  • 生成AIによる役割が無くなる恐れは常にある。しかし、ソフトウェアコンポーネントを統合し、顧客のビジョン実現に貢献するのは、人間の役割として依然残り続けること。仮にソフトウェアエンジニアの職がなくなっても、またエキサイティングな職業を探せば良い、ということ。

腹落ちポイント

  • 「理解」の3要素
    • 説明可能
    • 応用可能
    • いつでも使える
  • 知識の習得、課題解決において、常に原理原則を抑える
    • 無闇にやるな、仮説を立てて行動せよ
  • 生産性のために規則正しい生活は重要である。
    • 個人的なプログラマステレオタイプ的なイメージとして、夜遅く暗がりの中でコードを書いているイメージがあるが、一流のエンジニアは適切な規則性のもと働いているということが分かったのもよかった。

アクション

  • 「理解」の3要素を意識しながら、技術習得を心がける
  • 規則正しい生活習慣。やっぱり日照時間に生産的な活動した方が良いと思う。
  • コード理解において、隅々まで見ようとせず、局所から大局を掴む。
  • 失敗をオープンにする。評価が損なわれることを恐れずに笑いながら話してみる。
  • 知らない技術について、その技術について造詣が深い人に積極的に聞いてみる。

【英語記事】Why Rust is Making You Fail. 【感想】

medium.com

​ 『エコシステムや開発者の市場がまだ未熟なRust言語は、生産性や学習コストの観点で現場に導入するメリットはない』といった趣旨の記事になります。正直、Rust好きな開発者としては耳が痛いお話です。 ​

エコシステムや開発者の市場がまだ未熟であることは事実です。Rustに携わる開発者が、あらゆる側面において導入しやすい仕組みを導入していく必要があると私も感じております。 ​

しかし一方で、マイクロソフトやDiscord等、技術的難易度が高い現場において導入され、その利益は論理的に示されています。 ​

learn.microsoft.com discord.com

現時点では、技術採択について顧客の要求やしがらみ等の外的要因が少なく、柔軟な技術選択ができ、それでいて技術志向性が強い、ギークなエンジニアが多数いるスタートアップや、本当に低遅延性や耐障害性が求められる技術難易度が高いプロダクトにおいては Rustの採用事例が多くなり、Rustが好きな開発者はそこで開発経験を積みながら、全体の市場の動向を追えば良いのかなと思います。

​ また、現代的なマルチパラダイムプログラミング言語として、JavaScriptC++等の伝統的な言語の有用な性質を取り入れ、ユニークな概念や機構を持つRust言語を学ぶことは、技術者としての知見を広げてくれますので、そうした観点でもRustの習熟に重きを置くことは、個人的な開発者体験向上だけに繋がるのではなく、決して悪い選択肢ではないのかなと感じます。

私がプログラミングに惹かれた理由

なぜプログラミングが好きなのか? 自己分析みたいなもので、ここにまとめます。

最初は計算機としての側面に惹かれました。今まで紙に書いていた数学における計算式を、普遍的に実行可能な形式として、記号を組み合わせて書けることが新鮮でした。元々、数学は好きでしたが、その好きな理由の一つが、数式の記号の並びそのものが好きなのです。恐らく、小さな頃から絵を書くことが好きで、視覚表現そのものに強い興味があったのでしょう。プログラミング言語も、言語によって思想が違って、記号の並べ方が異なる点が面白く、そこからいろんな言語に触ってみたい、という好奇心の原動力になりました。

また、先生が提供する教材は、ゲーミフィケーション的な要素があり、 プログラミングの問題が難易度ごとに与えられていて、 その問題をパズルゲームのように解いていくように過程が面白くて、熱中しました。 容易に試行錯誤を重ねられて、明確なアウトプットが返ってくるので、 小さな達成感や前進感を積み重ねられる側面が自分に合っていたのだと思います。

そして、煩雑な処理を抽象化して、実装を効率化する過程自体が面白いなと感じていました。 分かりやすいコード、一意に識別しやすい綺麗なコードを書くことへのこだわりがとても強いです。 そういった観点でもやはりPerlの開発者のプログラマの三大美徳(怠惰, 短気, 傲慢)の適性が強いのかなと感じます。 怠惰なので、なんでも自動化・効率化したがる。本当に、面倒くさいことを解消するためにどんな苦労も厭いません。 短気なので、身近なボトルネックや不満をすぐに解消し、改善したがる。 傲慢なので、自分のコードに対して、分かりやすい・綺麗なコードを書くことに強いこだわりがあり、書くコードへの自信を持っている。そういったところでしょうか。

NativeWindの導入で詰まった話【2023】

公式DocのQuick Startを参照しながらやったのですが、詰まった点があり、手順を踏まえて共有します。React Nativeのバージョンは以下です。

"react-native": "^0.72.5",

詰まったところ

Quick StartのExpoの手順通りやったのに、.tsxファイル内のclassNameプロパティに対してNo overload matchs this callという内容のエラーがでる

解決策

app.d.tsファイルによる型拡張宣言を入れた

導入手順

1. Typescriptの設定ファイルを作成する

ルートディレクトリ直下に app.d.ts を作成し、以下を記述

/// <reference types="nativewind/types" />

※ここが重要です。公式のQuick Startの手順だとこの手順を踏むべきか分かりづらくなっていますが、この手順を挟まないと件のエラーが出ます。

2. TailwindCSSの設定・インストール

yarn add nativewind
yarn add --dev tailwindcss

次に以下を入力し、tailwind.config.jsを作成

npx tailwindcss init

tailwind.config.jsに以下を記述

// tailwind.config.js

module.exports = {
- content: [],
+ content: ["./App.{js,jsx,ts,tsx}", "./<custom directory>/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
}

3. Babel pluginの追加

babel.config.jsに以下のように追記する

// babel.config.js
module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
+   plugins: ["nativewind/babel"],
  };
};

参考文献

www.nativewind.dev

React NativeのWifiを用いた実機デバッグ

接続から起動まで一貫してまとめている記事がなかったこと、 また比較的新しいAndoird機種の設定方法が既存の記事と異なっていたため、まとめました。

機種

Pixel 7a, Android バージョン: 13

手順

  1. 設定画面 → デバイス情報 → ビルド番号を6回タップし、開発者向けオプションを有効にする
  2. 設定画面 → システム → 開発者向けオプション → ワイヤレスデバッグON
  3. ワイヤレスデバッグ → 「ペア設定コードによるデバイスのペア設定」で 対象IPアドレスとポート, 6ケタのコードが出力されるので、adb pairを用いて値を入力
adb pair xxx.xxx.xxx.xxx:xxxx
Enter pairing code: XXXXXX

すると、adb devicesコマンドで接続した端末のIPアドレスとポート番号が表示されるので、以下のようにadb connectIPアドレスとポート番号を指定して接続

adb connect 192.168.xxx.xxx:xxxxx

react-native run-android入力時に --deviceIdでId(端末の場合はIPアドレスとポート番号)を指定して起動

npx react-native run-android --deviceId 192.168.xxx.xxx:xxxxx

test

test

test