Enter

日々感じたことを記録するブログ

はじめてのFlutter -開発環境構築-

はじめに

こちらのFlutterのCodelabシリーズをやって行きたいと思います。

Write Your First Flutter App, part 1

今回はまず開発環境の設定まで。

インストール手順

公式ドキュメントはこちら。 - MacOS install - Flutter

AndroidStudioを利用する前提で解説していきます。 AndroidStudioをインストール済みならば、Set up an editor - Flutterを参照してFlutter Pluginsを導入しておきましょう。

Flutter SDKのダウンロード

  1. https://storage.googleapis.com/flutter_infra/releases/stable/macos/flutter_macos_v1.0.0-stable.zip からダウンロード。
  2. unzipして、ファイルを移動しておく
$ unzip ~/Downloads/flutter_macos_v1.0.0-stable.zip
$ mv ~/Downloads/flutter ~/bin/
  1. PATHを通す
# fishの場合
$ vim ~/.config/fish/config.fish

set -x PATH ~/bin/flutter/bin $PATH

実行環境の確認

flutterを実行するための依存ライブラリを確認します。 (詳細なログを見たい場合は、-vを付けるといい)

$ flutter doctor

エラーがある場合は、↓の様に☓マークがつくので解消しよう!

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.0.0, on Mac OS X 10.14 18A391, locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK 28.0.3)
    ✗ Android SDK file not found:
      /Users/sichien/Library/Android/sdk/platforms/android-28/android.jar.
[!] iOS toolchain - develop for iOS devices (Xcode 10.1)
    ✗ libimobiledevice and ideviceinstaller are not installed. To install with Brew, run:
        brew update
        brew install --HEAD usbmuxd
        brew link usbmuxd
        brew install --HEAD libimobiledevice
        brew install ideviceinstaller
    ✗ ios-deploy not installed. To install with Brew:
        brew install ios-deploy
[✓] Android Studio (version 3.2)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[!] VS Code (version 1.30.1)
[!] Connected device
    ! No devices available

依存環境の解消①: Android toolchain

Android Studio->SDK Manager->Android 9をダウンロード

$ flutter doctor --android-licenses

依存環境の解消②: iOS toolchain

エラーに出ているbrewコマンドを実行していく。

依存環境の解消③: VS Code (version 1.30.1)

Flutter pluginをインストール

依存解消後

flutter doctor -v
[✓] Flutter (Channel stable, v1.0.0, on Mac OS X 10.14 18A391, locale ja-JP)
    • Flutter version 1.0.0 at /Users/sichien/bin/flutter
    • Framework revision 5391447fae (5 weeks ago), 2018-11-29 19:41:26 -0800
    • Engine revision 7375a0f414
    • Dart version 2.1.0 (build 2.1.0-dev.9.4 f9ebf21297)

[✓] Android toolchain - develop for Android devices (Android SDK 28.0.3)
    • Android SDK at /Users/sichien/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
    • All Android licenses accepted.

[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 10.1, Build version 10B61
    • ios-deploy 1.9.4
    • CocoaPods version 1.5.3

[✓] Android Studio (version 3.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 31.3.1
    • Dart plugin version 181.5656
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)

[✓] VS Code (version 1.30.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 2.21.1

[!] Connected device
    ! No devices available

プロジェクト作成

Test drive - Flutter

  1. AndroidStudioを開いて、File > New Flutter Project. を選択。

f:id:enter178:20190114220438p:plain:w400

  1. 「Flutter Application」を選択し「Next」を押下。
  2. Project Nameを好きなものに変更。
  3. Flutter SDKのPATHが正しいか確認し、「Next」を押下。
  4. company domainを任意で変更して最後に「Finish」を押下。

しばらくすると、プロジェクトが立ち上がるので、これで作成完了:+1:

iOSAndroidでビルドしてみよう

AndroidStudioで対象のデバイスを選択して、Runボタンを押下します。

f:id:enter178:20190114220436p:plain:w300

iOS Simulator、Android Emulatorでビルド環境できるとこんな画面になります。 下の「+」ボタンを押すと画面中央の数字がカウントアップされます。

f:id:enter178:20190114220224p:plain:w400

次回からCodelab part1の内容に入っていきます。

MacでVimからNeoVimに移行してみる

NeoVimとは

巷では、次世代のVimと言われているNeoVim。 公式のGithubを見てみると、

  • Vimリポジトリをforkしたプロジェクトである。
  • メンテナンスビリティの向上とコントリビュートを簡単に。
  • モダンなUIを備えていて、既存のVimと互換性あり、プラグインが利用可能。

とのこと。

Vimのパッケージ管理がNeoBundleを使っていて、これが作者から「もうオワコンだよ、今後はバグフィックスだけ更新するね」ってなっていることもあり、NeoVim + dein.vimで環境を作り直すことに決めた。

インストール

さっそく、NeoVimをインストールしましょう。

$ brew install neovim
$ nvim -v
NVIM v0.3.3
Build type: Release
...

簡単!😁

プラグイン管理マネージャー: dein.vim 導入

Shougo/dein.vim: Dark powered Vim/Neovim plugin manager

闇の力を利用した最強のプラグインマネージャーdein.vimを導入しましょう。 こちらも簡単で、↓の様にshellスクリプトを落としてきて、実行するだけ。

curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
# ~/.cache/deinにプラグインのソースコードが入ってくる。パスは任意です。
sh ./installer.sh ~/.cache/dein

次に、NeoVimの設定ファイルを作っていきます。 NeoVimでは、XDG Base Directoryに対応しているので、~/.config/nvim/init.vimに書いていきます。 dotfileが大量発生してしまっているので、ツールごとにディレクトリにまとめる仕様になったと簡単に理解しています。 Vimと互換性があるので、 .vimrcを使ってもいいのですが、かなりカオスになっているので移行と同時にさよならします。😇

XDG Base Directoryを環境変数として設定しておく場合はこんな感じ。

# fish shell 
set XDG_CONFIG_HOME ~/.config

# bash shell 
export XDG_CONFIG_HOME=~/.config

~/.config/nvim/init.vim に設定を記入していきます。
その前に、ディレクトリを作っておきましょう。
mkdir -p ~/.config/nvim/

↓がinit.vimの内容です。 一部プラグインの設定が入っていますが、インストールするものについては次に説明します。

set number             "行番号を表示
set autoindent         "改行時に自動でインデントする
set tabstop=2          "タブを何文字の空白に変換するか 
set shiftwidth=2       "自動インデント時に入力する空白の数
set expandtab          "タブ入力を空白に変換
set clipboard=unnamed  "yank した文字列をクリップボードにコピー
set hls                "検索した文字をハイライトする
set termguicolors      "TrueColor対応"

"========================================="
" plugin Manager: dein.vim setting
"========================================="
if &compatible
  set nocompatible
endif

" プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~/.cache/dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif

" 設定開始
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " プラグインリストを収めた TOML ファイル
  " 予め TOML ファイル(後述)を用意しておく
  let g:rc_dir    = expand('~/.config/nvim/rc')
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

   " TOML を読み込み、キャッシュしておく
  call dein#load_toml(s:toml,      {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  call dein#end()
  call dein#save_state()
endif

" もし、未インストールものものがあったらインストール
if dein#check_install()
  call dein#install()
endif

let g:dein#install_max_processes = 16

"========================================="
" setting
"========================================="
filetype plugin indent on

syntax enable
colorscheme one
let g:airline_theme = 'one'
" powerline enable(最初に設定しないとダメ)
let g:airline_powerline_fonts = 1
" タブバーをかっこよく
let g:airline#extensions#tabline#enabled = 1
" 選択行列の表示をカスタム(デフォルトだと長くて横幅を圧迫するので最小限に)
let g:airline_section_z = airline#section#create(['windowswap', '%3p%% ', 'linenr', ':%3v'])
" gitのHEADから変更した行の+-を非表示(vim-gitgutterの拡張)
let g:airline#extensions#hunks#enabled = 0

プラグインの追加

dein.vimでは設定ファイルを別ファイルから読み込むことができるので、プラグイン管理ファイルを作成しておく。

$ mkdir -p  $XDG_CONFIG_HOME/nvim/rc/
$ touch $XDG_CONFIG_HOME/nvim/rc/dein.toml
$ touch $XDG_CONFIG_HOME/nvim/rc/dein_lazy.toml

使うプラグインdein.tomlに記述していきます。

[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'Shougo/deoplete.nvim'

[[plugins]]
repo = 'rakr/vim-one'

[[plugins]]
repo = 'vim-airline/vim-airline'

[[plugins]]
repo = 'airblade/vim-gitgutter'

そのあと、nvimで起動すると、自動的にプラグインを読み込んでくれます。設定後の画面はこんな感じになります。 f:id:enter178:20190113113249p:plain

Android DataBinding 入門 ① ~オブジェクト変化を監視するぞ~

はじめに

最近Androidで,Viewを取ってくるときによく使うfindViewByIdをぶっとばすために ButterKnifeを使うことを検討していた.
しかしButter Knife、今までありがとう。 Data Binding、これからよろしく。の記事を見たり,「DataBindingいいよ」という話を聞き,
標準で使えるDataBindingを使ってみようと思ったので,
連載形式で勉強していきたいと思う.
(RxAndroidもやっていく予定...宣言しておく!)

DataBindingとは?

まず,DataBindingについて整理していこう. 公式ドキュメントはここ. developer.android.com

DataBindingの言葉の意味はwikipediaによると,

XMLなどのデータソースとアプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術である。

分離されたデータソースとユーザインタフェースの間を橋渡しする役割を果たし、データが変更されるとそれに応じてユーザインタフェースが変更される一方向なデータバインディングと、 併せてユーザインタフェースの変更または操作に応じてデータが変更される双方向のデータバインディングがある。

重要な点としては,分離されたデータソースとUIの間の橋渡しをする役割であること.
これを最小限のコード量で実現できるのがDataBinding Libraryだと締めておく.

DataBindingを導入

Android StudioのプロジェクトでDataBindingを使えるようにするには, appディレクトリ以下のbuild.gradleにこれを追加するだけ!

android {
       ......
       dataBinding{
        enabled = true
    }
}

Android Studio 1.3以降がサポートしています. https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja#studio_support

findViewByIdをぶっとばせ

今回はサンプルとして,Hello worldを表示しているアプリを少しいじって,INABAボタンだけがあるだけのアプリを作成しました.
ここでは,INABAボタンにテキストをセットするところまでやります.

まず,レイアウトファイルを編集します.
サンプルファイルを以下に示しておきます.

// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.shin.test.model.User"/>
    </data>

    <RelativeLayout xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.shin.test.MainActivity">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"/>
    </RelativeLayout>
</layout>

やったこととしては,
1. レイアウトファイルのルートを<layout>
2. Bindさせたいデータオブジェクトを<data>で宣言する  - typeが型で,nameは変数名
3. Bindさせたい場所に@{}構文でセット

BindさせるデータオブジェクトはUserとして作りました.

// User.java
public class User{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

次に,ActivityでBindingオブジェクト取得してみましょう.

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding mActivityMainBinding;
    private User mUser1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mUser1 = new User();
        mUser1.setName("inaba");
        mActivityMainBinding.setUser(mUser1);
    }
}

mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); でレイアウトとBindされたオブジェクトを得ることができる.
このオブジェクトのクラス名のルールとしては, レイアウトファイル名の_を抜いてパスカルケースで単語を連ね,末尾にBindingがつく.

mActivityMainBinding.setUser(mUser1);で Bindingオブジェクトとレイアウトファイルの<data>タグ内で宣言されているデータオブジェクトと紐付ける.

ここでButtonのViewを取ってきたいときは,findViewById + キャストでなく,以下のようにしてとれる.

Button button = mActivityMainBinding.button;

(これが一番うれしい点!!)

ここまでで,ボタンにテキストをいれるとこまでできた.
f:id:enter178:20161225180918p:plain

オブジェクト監視

次にINABAボタンを押したら,MATSUMOTOボタンに変化するようにしてみよう.
普通にやるとしたら,ButtonオブジェクトにClickListenerをセットして,setTextすることになると思う.

Data Bindingで実現するには,先程作ったUserオブジェクトの変化を監視できるようにし,Bindingオブジェクトに通知してあげる必要がある.

まず,Userクラスを監視できるようにするにはBaseObservableを継承し,監視するフィールドのゲッターに@Bindableをつける. 変更をBindingオブジェクトに通知するため,notifyPropertyChanged(BR.name); を監視するフィールドのセッターで呼んであげる.これでOK.

public class User extends BaseObservable{
    private String name;
    
    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

監視の設定がおわったので,ボタンが押された時の動作を記述する.

// activity_main.xml
 <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            android:onClick="@{activity.onNameClick}"/>

Buttonにandroid:onClick="@{activity.onNameClick}"/>のよう,onClick属性を追加し,
onNameClickメソッドを定義しておく.

// MainActivity.java
    public void onNameClick(View view){
        Toast.makeText(this, "name click", Toast.LENGTH_SHORT).show();
        mUser1.setName("matsumoto");
    }
}

これで完成! 基本的な使い方はこれで

参考

Android Data Binding低コスト導入 | TECH Projin

ファシリテートをする際に気をつけたいこと

はじめに

最近,会議でファシリテートをすることが多くなり,自分でノウハウを持ちたいと思っていた.
そこで,出会ったのがこちらの本 www.amazon.co.jp

世界一やさしいと銘打つだけあって,小説形式ですごく読みやすく,内容もわかりやすかった.
意識したいことの備忘録として,書いておきます.

まず,ファシリテータの役割

会議とは何かを決める場である.
ファシリテートとは,何かを決めることを促進する・容易にすること.

気をつけるべきこと

  1. 自分の意見を押し通しすぎるな.意見を言う自分と客観点にファシリテーションする自分を使い分けろ
  2. やるべきことを決める場合,誰が いつまでに 何をするかまで決めよう
  3. ファシリテータとは,必ずしも司会者として,場を仕切るだけではない.参加者として会議を進行する隠れファシリテータもある
  4. 決まったこと,やるべきことを確認したら,会議のあとに参加者にメールといった手段で確認するようにしよう.記録になるし,催促する効果あり.
  5. 会議をはじめる前に,会議の目的の明確化と会議の終了条件を参加者皆で共有すべし.目指すべき方向を定めておく.
  6. 会議で無駄な時間は,資料を読み上げる時間だ.個々で黙読したほうが遥かに早い.
  7. 書くファシリをはじめよ.議論を可視化し,噛み合わせられるようにすることがメインで,キレイにまとめることではない.
  8. 会議の前には準備せよ.4つのPをまとめよ.
    ・Purpose:会議で達成したい目標
    ・Process:会議の終了条件にどうやってたどり着くのか,どの順番で何を議論するか.会議の流れを考える.
    ・People:会議に必要な人間を漏らさず呼んでいるか.貢献しない人は呼ばない.
    ・Property:会議に必要なものの用意.部屋,ホワイトボード,付箋とか
  9. 会議は主催者が作るものではなく,参加者全員に会議をよくする責任があり,少しでも生産性を高め,よい会議とする責任があることを忘れるな.

Softbank iPhone6のSIMカードをNexus5xで使えるようにしてみた

こちらの記事をみてやったらできた。
Nexus5にSoftBankのiPhoneSIMを刺して使ってみた

手順をまとめると、
1. Softbank用のAPNの設定
2. 通信事業者を変更する
って感じ。

ちなみにNexus5xのOSは7.0.0。
APN(Access Point Name)とは、モバイルネットワークでデータ通信をする際に必要となる接続先を指定する識別子のこと。

1. Softbank用のAPNの設定

設定 -> 「無線とネットワーク」からもっと見る -> モバイルネットワーク -> アクセスポイント名 -> 右上のプラスボタンから追加。

以下の値を設定する。

名前:softbank
APN: jpspir
Username: sirobit
Password: amstkoi
MCC: 440
MNC: 20
認証タイプ: PAP

2. 通信事業者の変更

設定 -> 「無線とネットワーク」からもっと見る -> モバイルネットワーク -> 通信事業者 画面に移動して、
Softbankを選択する。

はじめての組込みOS (3) ~ 静的変数の読み書き ~

今回は12ステップで作る組み込みos自作入門のステップ3を進めていく.

ステップ3では,ROMやRAMの違いやデータ領域,スタック,リンカスクリプトなどメモリ周りの学習がメイン.

組込みOSでのメモリ利用

通常のアプリケーションプログラミングでは,CPUのメモリ構成やメモリマップを把握する必要はほぼない.というのも汎用OSには仮想メモリという機構があるからである.

一方で組込みOSにはメモリを管理する機能が存在しないので,メモリの利用について考慮する必要がある. 具体的には

といった3点がある.

メモリの種類

今回でてきた用語は以下の3つ

用語 説明
ROM(Read Only Memory) read専用でプログラムからはwrite不可..しかし電源OFFでも内容を保持.
フラッシュROM 電気的に内容の書き換えが可能なROM
RAM(Random Access Memory) read, write可能だが,電源OFFで消失.

ROMもRAMもCPUとは独立した別モジュールではあるけれど,ある程度の容量を確保したものがCPUに予め内蔵されている場合が多い.

メモリと領域

プログラム実行の際,実行形式ファイルはメモリ上に展開されるわけだが,ただコピーされるわけではなくメモリ上の担当領域に分割して配置される.

領域名 保持する内容
テキスト領域 CPUが実行する機械語のコード
データ領域 初期値を持つstatic変数など
BSS領域 初期値を持たないstatic変数

wikipediaのページによるとBSS領域のBSSとは

BSSはBlock Started by Symbolというアセンブラの疑似命令に由来する。

だそうだ.これぐらいの理解でそっとしておく.

BSS領域について更に補足をすると,確保時にCPUやコンパイラ次第ではあるが,多くの場合で変数はゼロ,ポインタはNULLに初期化される.組込みシステムではあえてゼロクリアさせることで,コード上での初期化処理をなくし,データサイズを節約する場合によく使われる手段だそうだ.

実行形式ファイルのセクション

実行形式ファイルも同様に領域が分けられている.どんな領域に分かれているのかについては詳しく書かれていなかったが,複数の領域情報やファイルの情報を「ヘッダ」として持っている.これはお馴染みの通り,ファイルや領域の先頭に付加される.

変数や関数がどのようにメモリ上に配置されているのか確認してみる.
今回利用しているgccは実行形式ファイルをELF(Executable and Linkable Format)形式というフォーマットで出力する.

ELF形式はreadelfコマンドで解析できるのだが,Macにはデフォルトではいっていないため導入からやった. ↓のようにbrewコマンドを叩く.El Captain(10.11)はサポートしてないよと注意されるが試した所,動いていたので無視(´・ω・`)

$ brew install binutils                                                                                                                                                 
Warning: You are using OS X 10.11.
We do not provide support for this pre-release version.
You may encounter build failures or other breakage.

インストールが完了したら,

$ greadelf -a kzload.elf

と叩く.brewでいれたbinutilsのコマンドの先頭にはgがつくようだ.

↑のコマンドの結果の一部だが,↓のようなセクションに分かれていることがわかる. .textはテキスト領域に,.dataはデータ領域に対応している.

セクションヘッダ:
  [番] 名前              タイプ          アドレス Off    サイズ ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .vectors          PROGBITS        00000000 000074 000100 00  WA  0   0  4
  [ 2] .text             PROGBITS        00000100 000174 0002dc 00  AX  0   0  2
  [ 3] .rodata           PROGBITS        000003dc 000450 00001f 01 AMS  0   0  1
  [ 4] .data             PROGBITS        000003fc 000470 00000c 00  WA  0   0  4
  [ 5] .shstrtab         STRTAB          00000000 00047c 000038 00      0   0  1
  [ 6] .symtab           SYMTAB          00000000 0005f4 0003c0 10      7  44  4
  [ 7] .strtab           STRTAB          00000000 0009b4 000167 00      0   0  1

また,変数の配置場所もこのコマンドから確認できる.   ↓から_regという構造体の配列がアドレス:000003fcに配置されている.   ここから↑のセクションヘッダヘッダを見てみると,.data領域のアドレスが000003fcなのでdata領域に配置されていることが確認できる.   同様にして見てみると,main関数(アドレス:0000010c)は.text領域(00000100)に配置されていることがわかる.

シンボルテーブル '.symtab' は 60 個のエントリから構成されています:
  番号:      値 サイズ タイプ  Bind   Vis      索引名
︙
︙
 42: 000003fc    12 OBJECT  LOCAL  DEFAULT    4 _regs
︙
︙
︙
59: 0000010c    66 NOTYPE  GLOBAL DEFAULT    2 _main

リンカスクリプト

実行形式ファイルのデータのメモリ上への配置はリンクの段階で行われる.
つまり,リンクの際にはプログラムのどの部分がどのメモリアドレスに配置されるかをリンカに指定しなければならないが,これを行うのがリンカスクリプトである.

書籍においては,ステップ2の時点でのコードでは変数がROMに配置がされてしまっており,値の変更ができない. 変更できるようリンカスクリプトを書いて,プログラムをh8へ転送する際にはROMに書き込み,プログラム起動時には変数の初期値をROMからRAMにコピーし更に変数アクセスの際には,RAM上のアドレスに対しアクセスするように設定する.

その他でてきた用語を整理しておく.

  • 変数の初期値が配置されるアドレス
    • 物理アドレス(Physical Address PA)
    • ロードアドレス(Load Address LA)
    • Load Memory Address(LMA)
  • プログラムが変数にアクセスする際のアドレス
    • 論理アドレス(Logical Address LA)
    • リンクアドレス(Link Address LA)
    • 仮想アドレス(Virtual Address VA)
    • Virsutal Memory Address(VMA)

ここでの物理アドレスや仮想アドレスは厳密には相応しくないように思えるが,readelfの出力からこう呼んである.

プログラムヘッダ:
  タイプ       オフセット 仮想Addr   物理Addr   FileSiz MemSiz  Flg Align
  LOAD           0x000074 0x00000000 0x00000000 0x003fb 0x003fb RWE 0x1
  LOAD           0x000470 0x000003fc 0x000003fc 0x0000c 0x0000c RW  0x1

ELF形式はセッションの他にセグメントという管理単位を持つ.
↑はセグメント一覧である..プログラム実行時セグメント情報が参照され,メモリ上に展開される作業をロード(load)と呼び,ロードを行うプログラムをローダ(loader)と呼ぶ.

ここでELF形式のセッションとセグメントをまとめると

  • セッション
    • リンク時に同じ内容の領域をリンカがまとめるためのもの
  • セグメント
    • プログラム実行時にローダが参照してメモリ上に展開するためのもの

参照

静的変数の書き換え対応

コンパイルからh8へのプログラム転送までの作業メモ 

(書籍のP.36-参照)

$ pwd
~/workspace/12step/src/03/bootload

# ファームウェア作成
$ make 

# h8writeでフラッシュROMに書き込むため,.mot形式に変換
$ make image

h8をwriteモードに.
ディップスイッチを左からON,ON,OFF,ONにする. この状態で電源ON.

# h8writeの実行
$ make write

# シリアル接続する
# 接続解除する場合は「~.」を押下する.
$ sudo cu -l /dev/tty.usbserial-FTZ4UUFE 

フラッシュROMからの起動起動には ディップスイッチを左からON,OFF,ON,OFFにした状態で電源ON. で横にあるリセットボタンを押す.

C言語メモ

書籍の通りにごねごね進めて,プログラム実行して変数の変更まで完了 ・ω・!

参照

一言

ただの変数の読み書きといえども0からやるとなかなか手間がかかる.

Vimコマンドのエイリアス設定

いちいちvim画面でNERDTreeって打つのがめんどくさいので、エイリアス設定をした。

やり方は簡単で.vimrcに

:command <Alias名> <Aliasを付けたいコマンド>

って書けばよし。ただ注意が必要でAlias名は大文字から始まっている必要がある。

とりあえず以下の様に設定しておく。

:command Tr NERDTree



参考
alias - Aliasing a command in vim - Stack Overflow