- 投稿日:2019-09-09T21:01:41+09:00
【Mac】ReactでVR!? React 360を使用して、パノラマ画像を表示させる手順方法。
はじめに
セブ島もくもく会の中で、初学者を対象にしたVR開発入門講義を行いました。
環境構築から、パノラマ画像を表示させるまでの手順をこちらに残しておきます。やること
タイトル通りです。
ただし、各用語の解説はいたしません。手順のみです。
ご了承ください。React 360って?
Facebook社製のVR専用アプリケーションフレームワークです。
実はReactの書き方で、VRアプリも開発できます!
https://facebook.github.io/react-360/
開発環境(筆者の環境です。)
- macOS Mojave 10.14.5
- Node.js 12.6
- npm 6.9
Node.jsのインストール方法はこちらから。
https://qiita.com/AwesomeArsAcademia/items/4f685e2f46bab122f6cf必要なツールはこちらから。
開発環境を整える
react-360-cli
をインストールhttps://facebook.github.io/react-360/docs/setup.html
公式ドキュメントを参考に、開発環境を構築していきます。npmを使って、
react-360-cli
をインストールします。$ npm install -g react-360-cliアプリを立ち上げる
下記のコマンドを打つとフォルダが作成されます。
$ react-360 init Hello360 Creating new React 360 project... Project directory created at Hello360 ~省略~ success Saved lockfile. ✨ Done in 21.60s. Done! Now enter the new project directory by running `cd Hello360` Run `npm start` to initialize the development server From there, browse to http://localhost:8081/index.html Open `index.js` to begin editing your app. $ ls Hello360上記の指示通り、Hello360に移動して
npm start
を実行します。http://localhost:8081/index.html$ cd Hello360 $ npm start
上記のURLにアクセスしてみましょう。ロードに時間がかかると思いますが、しばらくすると下記のような表示が出るかと思います。
Welcome to React 360
からHello World
に変えてみる。(index.js)エディタを開きます。
index.js
を開くと下記が記載されているかと思います。ここで、15行目のindex.jsimport React from 'react'; import { AppRegistry, StyleSheet, Text, View, } from 'react-360'; export default class Hello360 extends React.Component { render() { return ( <View style={styles.panel}> <View style={styles.greetingBox}> <Text style={styles.greeting}> Welcome to React 360 </Text> </View> </View> ); } }; const styles = StyleSheet.create({ panel: { // Fill the entire surface width: 1000, height: 600, backgroundColor: 'rgba(255, 255, 255, 0.4)', justifyContent: 'center', alignItems: 'center', }, greetingBox: { padding: 20, backgroundColor: '#000000', borderColor: '#639dda', borderWidth: 2, }, greeting: { fontSize: 30, }, }); AppRegistry.registerComponent('Hello360', () => Hello360);
Welcome to React 360
をHello World
に書き換えます。
ファイルを保存して、ブラウザを更新しましょう。
下記のように表示されれば成功です!
パノラマ画像を表示させる。
パノラマ画像のフリー素材ですが、僕は下記のURLからダウンロードしました。
http://panoroman.nao3.net/ダウンロードしたら、
static_assets
のフォルダの配下に移動します。
名前も変更しましょう。
※今回はp1.jpg
で進めていきます。背景の画像を変更する際は
client.js
のファイルを編集します。client.js// This file contains the boilerplate to execute your React app. // If you want to modify your application's content, start in "index.js" import {ReactInstance} from 'react-360-web'; function init(bundle, parent, options = {}) { const r360 = new ReactInstance(bundle, parent, { // Add custom options here fullScreen: true, ...options, }); // Render your app content to the default cylinder surface r360.renderToSurface( r360.createRoot('Hello360', { /* initial props */ }), r360.getDefaultSurface() ); // Load the initial environment r360.compositor.setBackground(r360.getAssetURL('360_world.jpg')); } window.React360 = {init};20行目にある
こちらのr360.compositor.setBackground(r360.getAssetURL('360_world.jpg'));360_world.jpg
を先ほどダウンロードしたファイル名に書き換えます。
今回はp1.jpg
に変更します。
保存して、ブラウザを更新しましょう。
下記の表示になれば成功です!
マウスでグリグリ動かしてみましょう。
最後に
解説が欲しい方は下記の記事がおすすめです。
https://qiita.com/shiruco/items/3e77babe80a373c71fd5
https://qiita.com/bayarea-techblog/items/46531e0a64ffa1c0d181
- 投稿日:2019-09-09T15:04:41+09:00
教育版EV3 C言語プログラミング環境を整える
環境 その1(成功)
- OS: Microsoft Windows 10 64bit
- Cygwin: gcc-core, make, diffutils, perl
- GCC ARM: gcc-arm-none-eabi-5_4-2016q3-20160926-win32.zip
- U-Boot mkimage
- EV3用開発プラットフォーム(EV3RT): ev3rt-beta7-2-release.zip
- CPU: Intel(R) Core(TM) i7-7700 CPU @ 3.60 GHz
- 教育版レゴ マインドストームEV3
- microSDHC 東芝EXCERIA M302 32GB
- Bluetooth(R) USBマイクロアダプター BUFFALO BSBT4D200
- TeraTerm
注意点
Bluetooth接続時のデバイス名「Mindstorms EV3」やペアリングコード「0000」は、microSDHCカードの ev3rt\etc\rc.conf.iniを書き換えることで変更できる。
環境 その2 (成功)
- OS: macOS Mojave 10.12.6
- gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2
- Bluetooth PAN
参考にしたページ
- 投稿日:2019-09-09T13:02:00+09:00
JupyterLabの拡張機能jupyterlab-lspの導入方法(macOS)
自分の環境
・macOS Mojave バージョン10.14.6
・zsh 5.7.1
・pip 19.2.3
・pyenv 1.2.13
・python 3.6.9
・JupyterLab 1.1.2インストール
JupyterLab
JupyterLab
本体は$pip install jupyterlabでインストールしました。
nodebrew
Node.jsをインストールするために、Nodebrewを使用しました。
nodebrew
とは、Node.js
のバージョン管理するためのものです。それではnodebrewのインストール方法です。
(https://github.com/hokaccha/nodebrew)
この公式のインストール方法を参考にしました。まず、
curl
でnodebrew
をインストールします。$ curl -L git.io/nodebrew | perl - setupインストール完了後、
PATH
を通します。$echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc(
bash
の方は.zshrc
を.bashrc
にしてください)構成ファイルを再読み込みします。
$source ~/.zshrc$nodebrew helpで確認します。
バージョンなどの情報が出てきたら、インストール成功です。Node.js
やっと本題の
Node.js
をnodebrew
を使用し、インストールします。
JupyterLabの拡張機能はnpmを使用してインストールするので、Node.jsが必要です。$nodebrew install-binary latestでインストールします。
インストール終了後、$nodebrew ls v12.10.0でインストールされたバージョンを確認します。(私のバージョンは
v12.10.0
でした。)
次に、使うバージョンを指定します。$nodebrew use v12.10.0
Node.js
のバージョンを確認してみましょう。$node -v v12.10.0このようになっているはずです。
完了したら、jupyterLab
を起動します。$jupyter lab
起動後、上のパレットのようなアイコンを選択します。
その中の
を選択します。
選択するとこのようなポップアップが表示されるので[Enable]を選択します。
そうすると、
このようにチェックマークがつきます。さらに
このアイコンが追加されます。拡張機能をインストールする際はこのアイコンを選択して、@username/インストールしたい拡張機能で検索するか、
ターミナル上で$jupyter labextension install @username/インストールしたい拡張機能このようなコマンドを打つことでインストールすることができます。
jupyterlab-lsp
本命の拡張機能をインストールします。
(https://github.com/krassowski/jupyterlab-lsp )公式サイトを参考にインストールします。
ターミナル上で$jupyter labextension install @krassowski/jupyterlab-lspを実行すればインストールすることができます。
また、jupyterlab
上では@krassowski/jupyterlab-lsp
と検索すればインストールすることができます。お好きな方でインストールしてください。
jupyterLab
でインストールする際はRebuild
とページの再読み込み
は忘れず行ってください。
ターミナルでインストールする方もjupyterLabを起動したままの場合はページの再読み込み
を行ってください。次にターミナル上で
$pip install 'python-language-server[all]'を実行し、インストールします。
次に、任意のディレクトリに
servers.yml
を作成します。私はhomeディレクトリに作成しました。$vi ~/servers.ymlで
servers.yml
を起動し、中に以下を記述します。langservers: python: - pyls R: - R - --slave - -e - languageserver::run()
:wq
で保存が完了したら、作業は終了です。起動
jupyterlab-lsp
はjupyterlab
を起動する前に"毎回"以下のコマンドを実行する必要があります。$node path_to_jupyterlab_staging/node_modules/jsonrpc-ws-proxy/dist/server.js --port 3000 --languageServers servers.yml
path_path_to_jupyterlab_staging
は
.pyenvの場合
~/.pyenv/versions/YOUR_VERSION_OR_VENV/share/jupyter/lab/staging/
ローカルインストールの場合
~/.local/lib/python3.6/site-packages/jupyterlab/staging/
となります。
私の場合は$node ~/.pyenv/versions/3.6.9/share/jupyter/lab/staging/node_modules/jsonrpc-ws-proxy/dist/server.js --port 3000 --languageServersとしました。
このコマンドを実行後、jupyterlabを起動すると動くはずです。エラーが出る場合
~/.pyenv/versions/YOUR_VERSION_OR_VENV/share/
ディレクトリ以下にman
ディレクトリしかない場合、internal/modules/cjs/loader.js:775 throw err; ^ Error: Cannot find module '/Users/USER_NAME/.pyenv/versions/YOUR_VERSION_OR_VENV/share/jupyter/lab/staging/node_modules/jsonrpc-ws-proxy/dist/server.js' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:772:15) at Function.Module._load (internal/modules/cjs/loader.js:677:27) at Function.Module.runMain (internal/modules/cjs/loader.js:999:10) at internal/main/run_main_module.js:17:11 { code: 'MODULE_NOT_FOUND', requireStack: [] }このようなエラーが出ると思います。(というか私が初めて導入した際に出ました。)
出た場合は、ディレクトリを作成する必要があります。
share/
ディレクトリ内で$mkdir jupyter/lab/staging/このような階層を作ります。(
zsh
ならこれで一気に作成できます)
bash
を使っている方は$mkdir -p jupyter/lab/staging/で一気に作成することができます。
その後staging/
ディレクトリまで移動し、$npm initを実行します。このコマンドは
package.json
ファイルを作成するものです。実行した際、This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (share) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /Users/USER_NAME/.pyenv/versions/YOUR_VERSION_OR_VENV/share/package.json: { "name": "share", "version": "1.0.0", "description": "", "main": "index.js", "directories": { "man": "man" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this OK? (yes)このようなものが出ます。ここでは名前の設定など任意に設定できます。
しかし、めんどくさいので終わるまでenter
を押して問題ありません。
作成が終了したら、このコマンドで、Server.js
をインストールします。$npm install server終了後、このコマンドで
jsonrpc-ws-proxy
をインストールします。$npm i jsonrpc-ws-proxyこれで毎回打つコマンドのエラーは出ないと思います。
以上です。最後になりますが、
Tabを押さずにピリオドを打つだけで自動補完してくれる
jupyterlab-lsp
でpythonプログラミングを楽しみましょう!参考サイト
https://qiita.com/simonritchie/items/34504f03947bfb4f54f5
https://github.com/krassowski/jupyterlab-lsp
https://github.com/hokaccha/nodebrew
https://github.com/palantir/python-language-server
https://serverjs.io/tutorials/getting-started/
https://www.npmjs.com/package/jsonrpc-ws-proxy
https://jupyterlab.readthedocs.io/en/stable/user/extensions.html
- 投稿日:2019-09-09T10:36:31+09:00
MacにSQL Developerをインストールする方法
- 環境
- macOS Mojave バージョン10.14.6
- java version "1.8.0_45"
ダウンロードして起動する
- Oeacleのダウンロードページを表示する
- からログインする
- ライセンスに同意するのラジオボタンをON
- からダウンロードする
- 今回ダウンロードしたのは[sqldeveloper-19.1.0.094.2042-macosx.app.zip]
- zipを解凍して出てきた[SQLDeveloper.app]をアプリケーションディレクトリに格納する
- Launchpadから起動する
Oracleデータベースに接続してみる
- [+]マークから接続設定のダイアログを開く
- 接続内容を入力して[テスト]ボタンを押下
- 左下の[ステータス]に「成功」と表示されれば接続できているので[保存]ボタンで接続内容を保存する
- 投稿日:2019-09-09T10:36:21+09:00
UbuntuでMacbookのiSightカメラを利用可能にする
YOLOv3とか使ってみてリアルタイムのobject detectionをしようと思ったら、
Macの内蔵のiSightカメラがなんか使えなかったので自分用メモとして残しておく。環境
- MacBook Pro (Retina, 15-inch, Mid 2015)
- Ubuntu 18.04.3 LTS
やったこと
基本的には以下のコマンドをコンソールに打ち込んだだけ
とりあえず管理者権限へ切り替える$ sudo sugitのclone
$ git clone https://github.com/patjak/bcwc_pcie.gitcdする
$ cd bcwc_pcie/firmwaremakeしてインストール
$ sudo make $ sudo make install上の階層でもう1回makeしてインストール
$ cd .. $ sudo make $ sudo make installあとはカーネルモジュールのロードとか
$ sudo depmod $ sudo modprobe -r bdc_pci $ sudo modprobe facetimehdこれでLinuxからでもiSightカメラが利用可能になった。
v4l-utilsをインストールして確認してみる。$ v4l2-ctl --list-devices Apple Facetime HD (PCI:0000:04:00.0): /dev/video0
- 投稿日:2019-09-09T09:19:31+09:00
Macアプリ初心者:Realmの導入(CocoaPods利用)
今回はMacアプリでDBを使いたくてRealmについて調べてみました。
以前に作成したプロジェクトに組み込んでみます。完成イメージ
環境
- macOS Mojave:10.14.6
- Xcode:10.3
- CocoaPods:1.7.5
Realm インストール
Podfile の作成
$ pod init $ ls NSTableViewSample NSTableViewSample.xcodeproj PodfileRealm インストール
Podfile に
pod 'RealmSwift'
を追加$ vi Podfile
# Uncomment the next line to define a global platform for your project # platform :osx, '10.14' target 'NSTableViewSample' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for NSTableViewSample pod 'RealmSwift' endRealm インストール
$ pod install Analyzing dependencies Downloading dependencies Installing Realm (3.17.3) Installing RealmSwift (3.17.3) Generating Pods project Integrating client project Sending stats Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed. [!] Automatically assigning platform `osx` with version `10.14` on target `NSTableViewSample` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.Realm を使う
pod install
で作成された workspace を開く$ open NSTableViewSample.xcworkspace株式情報保存用のクラス(StockInfo)を作成
Object クラスを継承して作成します。
StockInfo.swiftimport Cocoa import RealmSwift class StockInfo: Object { @objc dynamic var name = "" @objc dynamic var price = -1 @objc dynamic var status = StockStatus.flat.rawValue @objc dynamic var createdAt = Date() } extension StockInfo { /// 状態をEnum形式で返却 var stockStatus: StockStatus { get { return StockStatus(rawValue: self.status) ?? StockStatus.flat } set { self.status = newValue.rawValue } } /// StockInfo オブジェクトを作成 class func create(realm: Realm, name: String, price: Int, status: StockStatus) -> StockInfo { let stockInfo = realm.create(StockInfo.self) stockInfo.name = name stockInfo.price = price stockInfo.stockStatus = status return stockInfo } /// 企業名で部分一致検索(空の場合は全件取得) class func objects(searchValue: String = "") -> Results<StockInfo> { var result = try! Realm().objects(StockInfo.self) let searchValue = searchValue.trimmingCharacters(in: .whitespaces) if searchValue != "" { result = result.filter("name CONTAINS %@", searchValue) } return result.sorted(byKeyPath: "createdAt") } /// デバッグ用 class func debugInitData() { let realm = try! Realm() try! realm.write { // データクリア realm.deleteAll() // サンプルデータ作成 let _ = StockInfo.create(realm: realm, name: "○○株式会社", price: 1000, status: .up) let _ = StockInfo.create(realm: realm, name: "○×水産", price: 12345, status: .down) let _ = StockInfo.create(realm: realm, name: "株式会社□○", price: 345, status: .flat) let _ = StockInfo.create(realm: realm, name: "×△ホールディングス", price: 321, status: .up) let _ = StockInfo.create(realm: realm, name: "ABC BANK", price: 20, status: .down) let _ = StockInfo.create(realm: realm, name: "▼○重工", price: 98000, status: .up) // サンプル用に1,000 件データを作成 for i in 1...1_000 { let status = StockStatus.init(rawValue: Int.random(in: 0..<3))! let price = Int.random(in: -1..<10_000_000) let _ = StockInfo.create(realm: realm, name: "○△×株式会社 \(i)", price: price, status: status) } } } }株価情報の状態を表すEnum(StockStatus)を作成
StockStatus.swiftimport Cocoa enum StockStatus: Int { case flat = 0 case up case down /// 状態ごとのImageオブジェクト var image: NSImage { get { switch self { case .flat: return NSImage(named: NSImage.Name("flat"))! case .up: return NSImage(named: NSImage.Name("up"))! case .down: return NSImage(named: NSImage.Name("down"))! } } } /// 状態ごとのカラーオブジェクト var color: NSColor { get { switch self { case .flat: return .gray case .up: return .green case .down: return .red } } } }StockInfo クラスを利用して株価情報を表示
細かい説明は省きますが、リファクタリングして多少見やすくなっているはずです。
ViewController.swiftimport Cocoa class ViewController: NSViewController { // MARK: - IBOutlet @IBOutlet private weak var tableView: NSTableView! { didSet { self.tableView.dataSource = self self.tableView.delegate = self self.tableView.headerView = nil self.tableView.rowHeight = 88 } } @IBOutlet private weak var countTextField: NSTextField! // MARK: - private variables private var stockValues = StockInfo.objects() // MARK: - override func override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. // デバッグ用にデータ作成 StockInfo.debugInitData() // 株価情報をViewに反映 self.updateStockValuesCount() } override var representedObject: Any? { didSet { // Update the view, if already loaded. } } // MARK: - private func private func updateStockValuesCount() { let formatter = NumberFormatter() formatter.numberStyle = .decimal let commaString = formatter.string(from: NSNumber(value: self.stockValues.count))! self.countTextField.stringValue = "\(commaString)件" } // MARK: - actions @IBAction func actionSearchField(_ sender: NSSearchField) { self.stockValues = StockInfo.objects(searchValue: sender.stringValue) self.tableView.reloadData() self.updateStockValuesCount() } } extension ViewController: NSTableViewDataSource, NSTableViewDelegate { // MARK: - NSTableViewDataSource func numberOfRows(in tableView: NSTableView) -> Int { return self.stockValues.count } // MARK: - NSTableViewDelegate func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let result = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyView"), owner: self) as! CustomNSTableCellView // Set the stringValue of the cell's text field to the nameArray value at row let stock = self.stockValues[row] result.image = stock.stockStatus.image result.name = stock.name result.color = stock.stockStatus.color result.price = stock.price // Return the result return result } }
- 投稿日:2019-09-09T06:56:27+09:00
DiskMaker XでmacOS MojaveのインストールUSBを簡単に作成
- 投稿日:2019-09-09T05:57:38+09:00
【ターミナル改造⑥】様々な機能や要素を取り入れた、高機能で便利な新規シェルの「nushell」を試用
- 白黒ターミナルを利用する生活が多くなってきた無機質生活に、少々彩りを加えるために奔走する記事第六弾。
- 改造前後のターミナル差分が、「表面変化九割」という事実資料を打ち付けられてもなお、彩りツールの調査に勤しむ。
- 今回は、「劇的な見やすさ・高機能」が評判のシェル「Nu Shell」を試用することにしよう。
概要
特徴
構造データ表示
- これまでのブロック型表示ではなく、テーブル化された構造データで、出力される。
- そのため内容を、従来のテーブル操作のように簡単に「並べ替え・フィルター操作」等が可能。
自動構造化
- jsonファイルやcsvファイル等のデータ型ファイルを、コマンド一発でテーブル構造表示で確認することができる。
- そのため、ファイルを直接編集することなく、「より見やすい可視化・必要な値だけのフィルタ抽出」等が可能。
コマンド互換
- nushellで独自に扱える豊富なコマンドに加えて、これまで利用していたコマンドも利用できる。
- そのため、覚えることが少なく、より高機能なコマンド操作が可能。
結果
- 下記のように、構造データとして扱うため、ファイル内容がテーブル型で見やすく表示される。
- また、jsonやcsv等のファイルを、独自の内部コマンドで、直接編集することなく「構造化・フィルタ操作」等が可能。
- また、独自コマンドだけではなく、「^」をつけてのコマンド入力で、これまで利用してきたコマンドも扱える。
作業環境
- Mac OS X 10.13.4
インストール
リリースページからのインストール
- ※今回は試用のため、コマンドでのインストールではなく、この方法を利用。
- まずこちらのページにアクセスして、自分の環境(Mac,Windows)に合わせたファイルをダウンロード。
2. ダウンロード後、任意のフォルダに展開・解凍して、中身が下記であることを確認する。
3. 確認後、フォルダ内の「nu」を起動して、シェル画面が起動すれば完了。コマンドからのインストール
- ※今回は試用のため、コマンドでのインストールでは行わず、上記のリリースページからの導入
- 各環境(Mac,Windows,Linux)でのコマンドでのインストールはこちらを参考。
- ※どちらもRust環境やコンパイラの導入等が必要。
操作
- ※コマンドとして多数の組み合わせがあるため、今回は基本使用や頻繁使用に応じた操作例とする。
- ※各種コマンド一覧はこちらを参考にする
基本操作例
- nushellでの操作の基本コマンド例としては主に下記。
- ※例は、nushell起動済みでの操作。
- ※cdやmv等の標準コマンドは、「^cd」のように入力せずに、そのまま使用可能。
コマンド 内容 ls
作業(カレント)ディレクトリのファイル・フォルダ情報確認 ls | pick 項目
指定項目でのファイル・フォルダ情報確認
例:ls | pick name size created
ls | reject 項目
指定項目を除外したファイル・フォルダ情報確認
例:ls | reject type size
ps
動作プロセス確認
ps | where 条件
指定条件に合致した動作プロセス確認 ps | where cpu > 5
ps | sort-by 項目 | first 表示数
指定項目で並べ替え、指定表示数で動作プロセス確認
例:ps | sort-by cpu | first 3
open 対応形式ファイル
対応したデータ形式ファイルを、構造データへ自動整形して表示
現状の対応ファイルは、「json,yaml,toml,xml,csv,ini」
例:open package.json
date
現在日時確認 enter パス名
指定パスを開始位置にした新規シェルの作成
シェルの切り替えは「p
,n
」で行うenter /作業フォルダ名
shells
作成シェル一覧 help
ヘルプ情報表示 version
バージョン情報表示 操作画像例
- 上記のようなファイルやデータ操作等の実際の画像例としては、下記。
- 上記のようなシェル作成や切り替え等の操作の実際の画像例としては、下記。
まとめ
- 今回は新規シェルの試用ということで、未知数で計り知れないツールに、巡り会えて利用していることを、錯乱状態になりながら記事を書く。
- 「より良い可視化・高機能」なツールのはびこりが進む真っ只中に、技術者になった新米な私は、余計な自画自賛。
- この未知数ツールと賢人開発者への礼拝と、今後の行く末を見届ける決断をしてから、次回調査をすることにしよう。
参考
- https://github.com/nushell/nushell
→公式Githubです。大変お世話になりました。- https://book.nushell.sh/
→公式ドキュメントです。大変お世話になりました。- https://www.jonathanturner.org/2019/08/introducing-nushell.html
→開発者ブログです。大変お世話になりました。- https://dev.classmethod.jp/tool/try-rust-nushell/
→参考にしました。大変お世話になりました。
- 投稿日:2019-09-09T01:17:19+09:00
Macのターミナルでスーパーユーザーでログインする時だけ、日本語が???になり、かな入力が拒否される問題の解決策
問題の現象
Macのターミナル起動時のユーザーの状態では、かなモードで日本語入力ができます。ところが、suコマンドでrootとしてログインした途端、日本語のファイル名は????になり、かなモードが入力拒否される状態になりました。
症状の詳細
起動時のユーザーではかな入力が可能、日本語も表示される
ターミナル起動時のユーザーでは問題なくかなモードでの入力が可能でした。
localeコマンドでも以下の通り、UTF-8になっています。
$ locale
LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_ALL=ところが、スーパーユーザーだとかな入力は拒否され、日本語は?????と表示される…
rootでlocaleコマンドを入力すると、以下のようにCになっています。
# locale
LANG= LC_COLLATE="C" LC_CTYPE="C" LC_MESSAGES="C" LC_MONETARY="C" LC_NUMERIC="C" LC_TIME="C" LC_ALL=この状態でlsコマンドで確認すると日本語のファイ名が???で表示されました。
?????????.png解決への手順
① ターミナルの環境設定の詳細の確認
Control+Vで非ASCⅡ入力をエスケープはチェックが外れていること。
テキストエンコーディングがUTF-8になっていること。
② .bash_profileを作成(日本語を表示させる)
.bash_profileとは、bashログインシェル時に1回は実行されるファイルです。
こちらに、日本語を表示させるための記述をしておきます。
作成場所は、rootの$HOME直下です。
最初からない場合が多く、viで.bash_profileを作成し、以下を追記します。作成場所は、rootの$HOME直下です。
最初からない場合は、viで.bash_profileを作成し、以下を追記します。cdコマンドでHOMEへ移動します。
# cd $HOME
viコマンドで.bash_profileを作成します。
# vi .bash_profile
次のように記述します。
.bash_profileexport LC_ALL=ja_JP.UTF-8 export LANG=ja_JP.UTF-8その次に、sourceコマンドで実行させます。
# source ~/.bash_profile
localeコマンドで確認すると、変更されていることが確認できます。
# locale
LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_ALL="ja_JP.UTF-8"この直後から、ファイル名は日本語で表示されるようになります。
ところが、問題が2つ残りました。
1つ目は、かなモードでは入力拒否される問題。
2つ目は、.bash_profileが起動時に実行されない問題。
なので、スーパーユーザーをログアウトし、ログインし直すと…日本語が????と表示され、sourceコマンドを毎度使用しなくてはなりませんでした。③ .profileを作成(日本語を表示させる)
.bash_profileが読み込まれない問題がある方は、.profileに②と同様の記述をすると日本語表示の問題は解決します。
Appleのデベロッパーに以下の説明があります。
https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/BeforeYouBegin/BeforeYouBegin.html#//apple_ref/doc/uid/TP40004268-CH1-SW15
(Google翻訳より引用)Bourneシェル(bash、zshなど):
環境変数を永続的に設定してエイリアスを追加するには、適切なalias 、変数の割り当て、およびexportコマンドを次のファイルに追加できます。
~/.profile —すべてのログインシェルに対して自動的に実行されます。
~/.bash_profile — .profileに似ていますが、 bashログインシェルでのみ実行されます。
~/.bashrcおよび~/.zshrcすべての非ログインbashまたはzshシェル~/.bashrc自動的に実行されます(コマンドラインでbashまたはzshを明示的に入力するか、 #!/bin/bashまたは#!/bin/zshで始まるスクリプトを実行した場合) #!/bin/zsh )。つまり、exportコマンドを追加できることが保証されており且つ.profileの方がすべてのログインシェルに対して自動的に実行されるということは、.bash_profileよりもどのログイン方法でも確実に読み込まれると解釈できます。
作成場所は、rootの$HOME直下です。
元からない場合は、viで.profileを作成し、以下を記述します。.profileexport LC_ALL=ja_JP.UTF-8 export LANG=ja_JP.UTF-8次に、スーパーユーザーをログアウトして再ログインして、localeコマンドで確認するとUTF-8になっており、日本語が表示されるようになりました。
念のため、②で作成した.bash_profileの中の記述は削除しておきました。(ファイルだけ残してあります。)日本語表示に関しては解決したとは言え、bash_profileが読み込まれないことは動作としておかしいので、気持ちが悪いですね。
④ .inputrcを作成(日本語入力を出来るようにする)
コマンドラインで日本語を表示、使用したい時のreadlineの設定になります。
こちらをすることで、かなモードでの入力拒否がされなくなります。作成場所は同じく、rootの$HOME直下です。
viコマンドで.inputrcを作成します。
# vi .inputrc
次のように記述します。
.inputrcset convert-meta off set input-meta on set output-meta onそして、bindコマンドで読み込みます。
オプション -f の意味は、「指定したinputrc書式のファイルからキーバインドなどの設定を読み込む(有効にする)」です。
# bind -f .inputrc
すると、日本語入力ができるようになりました!
課題残る…
bashログインシェル時に1回は実行されるはずの.bash_profileが実行されない問題が残ってしまいました。
どなたか、解決策をご存知の方がいらっしゃったら、ご教授頂けると幸いです。