Visual Studio CodeをES6に対応させる
プロジェクトフォルダ直下に設定ファイルを作成する
// jsconfig.json { "compilerOptions": { "target": "ES6" } }
平成28年度診療報酬改定 基本指針
基本方針(中医協協議会資料より)
1. 改定にあたっての基本認識
超高齢社会における医療政策の基本方向
- 団塊の世代が75歳以上となる平成37年(2025年)に向けた安全・安心、質の高い効率的な医療の提供
- 疾病構造の変化に伴い「治す医療」から「治し、支える医療」、予防医学
- 人口減少に伴う医療保険制度の持続可能性の確保
地域包括ケアシステムと効果的・効率的で質の高い医療提供体制の構築
- 医療機能の分化・強化、連携や医療・介護の一体的な基盤整備
- そのための質の高い人材の確保、医療従事者の負担軽減
経済成長や財政健全化との調和
- 経済・財政との調和
- 無駄の排除や医療資源の効率的な配分、医療分野におけるイノベーションの評価等を通じた経済成長への貢献
2. 改定の基本的視点と具体的方向性
1. 【重点課題】地域包括ケアシステムの推進と医療機能の分化・強化、連携に関する視点
(基本的視点)
- 必要に応じた質の高い医療・介護サービスへのニーズ
- そのためへの機能分化・基盤整備を含めた地域包括ケアシステムの構築
(具体的方向性の例)
- 入院医療の評価
- チーム医療の推進、勤務環境の改善、業務効率化の取組等を通じた医療従事者の負担軽減・人材確保
- 地域包括ケアシステム推進のための取組の強化
- 患者の状態に応じた診療が行われるよう、かかりつけ医の機能を評価
- 同様に、適切な服薬管理が行われるよう、かかりつけ薬剤師・薬局の機能を評価
- 多職種連携の強化(医師、歯科医師、薬剤師、看護師等)
- 患者の早期退院、住み慣れた地域での療養・生活が継続できるための取組を推進
- 質の高い在宅医療・訪問看護の確保
- 患者の状態を考慮した効率的・効果的で質の高い在宅医療・訪問看護の提供体制
- 医療保険制度改革法も踏まえた外来医療の機能分化
- 医療制度改革法
- 大病院・中小病院・診療所の機能分化
- 外来医療の機能分化・連携の推進
2. 患者にとって安心・安全で納得できる効果的・効率的で質が高い医療を実現する視点
(基本的視点)
- 患者自身による主体的な医療の選択
- 「生活の質」を高める「治し、支える医療」の実現
(具体的方向性の例)
- かかりつけ医の評価、かかりつけ歯科医の評価、かかりつけ薬剤師・薬局の評価
- 情報通信技術(ICT)を活用した医療連携や医療に関するデータの収集・利活用の推進
- 質の高いリハビリテーションの評価等、患者の早期の機能回復の推進
3. 重点的な対応が求められる医療分野を充実する視点
(基本的視点)
(具体的方向性の例)
- 緩和ケアを含む質の高いがん医療の評価
- 認知症患者への適切な医療の評価
- 地域移行・地域生活支援の充実を含めた質の高い精神医療の評価
- 難病法の施行を踏まえた難病患者への適切な医療の評価
- 小児医療、周産期医療の充実、高齢者の増加を踏まえた救急医療の充実
- 口腔疾患の重症化予防・口腔機能低下への対応、生活の質に配慮した歯科医療の推進
- かかりつけ薬剤師・薬局による薬学管理や在宅医療等への貢献度による評価・適正化
- 医薬品、医療機器、検査等におけるイノベーションや医療技術の適切な評価
4. 効率化・適正化を通じて制度の持続可能性を高める視点
(基本的視点)
- 医療費増大に対していかに国民皆保険の維持するか
- 医療サービスの維持・向上、医療費の効率化・適正化
(具体的方向性の例)
- 後発医薬品の使用促進・価格適正化、長期収載品の評価の仕組みの検討
- 価格算定ルールの見直し
- 長期収載品の価格引下げルールの見直し
- 退院支援等の取込による在宅復帰の推進
- 残薬や重複投薬、不適切な多剤投薬・長期投薬を減らすための取組など医薬品の適正使用の推進
- 患者本位の医薬分業を実現するための調剤報酬の見直し
- 重症化予防の取組の推進
- 疾患の進展の阻止や合併症の予防、早期治療の取組を推進
- 医薬品、医療機器、検査等の適正な評価
改定率
ネット改定率(全体) ▲0.84%
診療報酬本体 +0.49%
- 医科 +0.56%
- 歯科 +0.61%
- 調剤 +0.17%
薬価等
- 薬価 ▲1.22%
- 材料価格 ▲0.11%
How to build Rails5 API + Redux ToDo Application その1
Rails5から実装されるAPI専用アプリケーションの作成手順です。
プロジェクトの生成からAPI経由でのアクセスまで試してみます。
Rails5の取得
githubからRails5を取得するため適当なディレクトリに以下のGemfileを作成します。
Gemfile
source 'https://rubygems.org' gem 'rails', github: 'rails/rails'
Gemfileを作成後、以下のコマンドを実行し直下にrailsを取得します。
$ bundle install --path vendor/bundle
Rails5 APIアプリケーションの作成
同ディレクトリで以下のコマンドを実行します。
rails newコマンドにapiオプションを指定するとAPIのみのアプリケーションが生成されます。
$ bundle exec rails new <application-name> --api
雛形の作成
生成されたアプリケーションのディレクトリに移動し、APIの雛形となるscaffoldを生成します。
$ bin/rails g scaffold todo title completed:boolean order:integer Running via Spring preloader in process 3582 invoke active_record create db/migrate/20160120044614_create_todos.rb create app/models/todo.rb invoke test_unit create test/models/todo_test.rb create test/fixtures/todos.yml invoke resource_route route resources :todos invoke scaffold_controller create app/controllers/todos_controller.rb invoke test_unit create test/controllers/todos_controller_test.rb
雛形を作成したらDBのmigrationをします。
$ bin/rails db:migrate == 20160120044614 CreateTodos: migrating ====================================== -- create_table(:todos) -> 0.0016s == 20160120044614 CreateTodos: migrated (0.0016s) =============================
サーバーの起動
以下のコマンドを実行しサーバーを起動します。
$ bin/rails s => Booting Puma => Rails 5.0.0.beta1 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server I, [2016-01-20T13:57:13.149636 #10181] INFO -- : Celluloid 0.17.3 is running in BACKPORTED mode. [ http://git.io/vJf3J ] Puma 2.15.3 starting... * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://localhost:3000
※2016/01/20 サーバー起動時にactionpackがエラーを吐き出します。取り急ぎ実行したい場合は以下のファイルを編集して下さい。
config/initializers/per_form_csrf_tokens.rb
# Be sure to restart your server when you modify this file. # Enable per-form CSRF tokens. # 下記の行をコメントアウト # Rails.application.config.action_controller.per_form_csrf_tokens = true
APIへのアクセス
ToDOの作成
クライアント
$ curl -H "Content-Type:application/json; charset=utf-8" -X POST -d '{ "title":"単2電池を買いに行く", "order":1, "completed":false }' http://localhost:3000/todos {"id":1,"title":"単2電池を買いに行く","completed":false,"order":1,"created_at":"2016-01-20T05:12:28.395Z","updated_at":"2016-01-20T05:12:28.395Z"}% curl -H "Content-Type:application/json; charset=utf-8" -X POST -d '{ "title":"お土産を買いに行く", "order":1, "completed":false }' http://localhost:3000/todos {"id":2,"title":"お土産を買いに行く","completed":false,"order":1,"created_at":"2016-01-20T05:13:50.865Z","updated_at":"2016-01-20T05:13:50.865Z"}%
サーバー
Started POST "/todos" for ::1 at 2016-01-20 14:04:17 +0900 ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations".* FROM "schema_migrations" Processing by TodosController#create as */* Parameters: {"title"=>"単2電池を買いに行く", "order"=>1, "completed"=>false, "todo"=>{"title"=>"単2電池を買いに行く", "completed"=>false, "order"=>1}} (0.1ms) begin transaction SQL (7.8ms) INSERT INTO "todos" ("title", "completed", "order", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["title", "単2電池を買いに行く"], ["completed", false], ["order", 1], ["created_at", 2016-01-20 05:04:17 UTC], ["updated_at", 2016-01-20 05:04:17 UTC]] (1.1ms) commit transaction Completed 201 Created in 32ms (Views: 1.5ms | ActiveRecord: 9.8ms) Started POST "/todos" for ::1 at 2016-01-20 14:13:50 +0900 Processing by TodosController#create as */* Parameters: {"title"=>"お土産を買いに行く", "order"=>1, "completed"=>false, "todo"=>{"title"=>"お土産を買いに行く", "completed"=>false, "order"=>1}} (0.1ms) begin transaction SQL (0.4ms) INSERT INTO "todos" ("title", "completed", "order", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["title", "お土産を買いに行く"], ["completed", false], ["order", 1], ["created_at", 2016-01-20 05:13:50 UTC], ["updated_at", 2016-01-20 05:13:50 UTC]] (0.7ms) commit transaction Completed 201 Created in 4ms (Views: 0.6ms | ActiveRecord: 1.2ms)
ToDO一覧の取得
クライアント
$ curl http://localhost:3000/todos [{"id":1,"title":"単2電池を買いに行く","completed":false,"order":1,"created_at":"2016-01-20T05:12:28.395Z","updated_at":"2016-01-20T05:12:28.395Z"},{"id":2,"title":"お土産を買いに行く","completed":false,"order":1,"created_at":"2016-01-20T05:13:50.865Z","updated_at":"2016-01-20T05:13:50.865Z"}]%
サーバー
Started GET "/todos" for ::1 at 2016-01-20 14:15:23 +0900 Processing by TodosController#index as */* Todo Load (0.2ms) SELECT "todos".* FROM "todos" Completed 200 OK in 3ms (Views: 2.1ms | ActiveRecord: 0.2ms)
ToDOの更新
クライアント
curl -H "Content-Type:application/json; charset=utf-8" -X PATCH -d '{ "completed":true }' http://localhost:3000/todos/1 {"id":1,"completed":true,"title":"単2電池を買いに行く","order":1,"created_at":"2016-01-20T05:12:28.395Z","updated_at":"2016-01-20T05:17:05.151Z"}%
サーバー
Started PATCH "/todos/1" for ::1 at 2016-01-20 14:17:05 +0900 Processing by TodosController#update as */* Parameters: {"completed"=>true, "id"=>"1", "todo"=>{"completed"=>true}} Todo Load (0.3ms) SELECT "todos".* FROM "todos" WHERE "todos"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] (0.1ms) begin transaction SQL (0.4ms) UPDATE "todos" SET "completed" = ?, "updated_at" = ? WHERE "todos"."id" = ? [["completed", true], ["updated_at", 2016-01-20 05:17:05 UTC], ["id", 1]] (1.0ms) commit transaction Completed 200 OK in 75ms (Views: 0.5ms | ActiveRecord: 1.8ms)
うるう年の判定ってこんなんじゃまずいのかな?
( (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 )
久しぶりにRailsなんて触っちゃってみる
sudo gem install rails
こんなエラーが出るかもしれない。
Installing ri documentation for rails-3.1.3... File not found: lib
Rdocを新しいやついれれば解決。
sudo gem install rdoc
プロジェクト作成&サーバー起動!
rails new hogehoge
cd hogehoge
rails server
こんなエラーが出るかもしれない。
/usr/local/lib/ruby/gems/1.9.1/gems/execjs-1.2.9/lib/execjs/runtimes.rb:47:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable) from /usr/local/lib/ruby/gems/1.9.1/gems/execjs-1.2.9/lib/execjs.rb:5:in `<module:ExecJS>' from /usr/local/lib/ruby/gems/1.9.1/gems/execjs-1.2.9/lib/execjs.rb:4:in `<top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `<top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `<top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1:in `<top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `block (2 levels) in require' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `block in require' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:122:in `require' from /hogehoge/config/application.rb:7:in `<top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands.rb:52:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands.rb:52:in `block in <top (required)>' from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands.rb:49:in `tap' from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands.rb:49:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
https://github.com/sstephenson/execjs
のリストにあるJSエンジン入れろと言っているので
sudo apt-get install nodejs
再度実行!
rails server => Booting WEBrick => Rails 3.1.3 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2011-11-29 22:04:02] INFO WEBrick 1.3.1 [2011-11-29 22:04:02] INFO ruby 1.9.3 (2011-10-30) [i686-linux] [2011-11-29 22:04:02] INFO WEBrick::HTTPServer#start: pid=23096 port=3000
でとりあえず起動できたよ。
ProgressBarに画像を使う
ProgressBarってバージョンごとに色が違ったり色合いがダサかったりでヤダ!
ってことで独自で定義するやり方。
背景画像(progress_back.png)
メーター画像(progress_front.png)
どちらも幅1pxの画像。
プログレスバーのdrawable
custom_progress.xml
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background" android:drawable="@drawable/progress_back"/> <item android:id="@android:id/progress"> <clip android:drawable="@drawable/progress_front"/> </item> </layer-list>
レイアウト
main.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#AAAAAAAA"> <ProgressBar android:id="@+id/progress_bar" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_gravity="center" android:progressDrawable="@drawable/custom_progress" style="?android:attr/progressBarStyleHorizontal" /> </FrameLayout>
アクティビティ
MainActivity.java
package com.sample; import android.app.Activity; import android.os.Bundle; import android.widget.ProgressBar; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar); progressBar.setMax(100); progressBar.setProgress(50); } }
ただし、現行のADT 10.0.1では、これ(main.xml)をグラフィカルエディタで表示した場合に、
java.lang.UnsupportedOperationException Exception details are logged in Window > Show View > Error Log
となり、
android:progressDrawable="@drawable/custom_progress"
の部分でエラーが起きてエディタが使えない。
なので、プログラム上で
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.custom_progress));
って設定するほうが良いかも。
タブレット時代のレイアウト FragmentLayout
Androidは解像度の異なる端末がいろいろ出てきて悩みどころ。
タブレット型に関してはFragments API使えばiPadっぽいレイアウトが組めるらしいけど現状3.0のみだし。
iPadとiPhoneのようにマーケットが分かれていれば片方のみ対応とかできるけどAndroidはそうもいかないし...
とか、いろいろ困ってる人たちに朗報が!
Google、Android 3.0の「Fragments API」で非互換性問題を解消へ
http://japan.internet.com/allnet/20110309/8.html
Android Developers Blog「Fragments For ALL」
http://android-developers.blogspot.com/2011/03/fragments-for-all.html
なんとFragments APIが1.6までの後方互換が効くようになった。
ってことでやってみよう。
まず、「Android SDK and AVD Manager」の「Available Packages」に
Android Compatibility package
が増えているのでインストール。
そうするとSDKのディレクトリにandroid-compatibilityフォルダができていて、
その下にv4/android-support-v4.jarがあるのでライブラリに追加する。
これがFragmentsの後方互換ライブラリ。
ではアプリ作成。
作るのはリストのアイテムを選択すると詳細画面が表示される、というシンプルなもの。
レイアウトファイルの作成
まず、縦向きと横向き用のレイアウトを用意
縦:layout/fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment class="com.sample.MainActivity$TitlesFragment" android:id="@+id/titles" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout>
横:layout-land/fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment class="com.sample.MainActivity$TitlesFragment" android:id="@+id/titles" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> <FrameLayout android:id="@+id/details" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> </LinearLayout>
詳細画面のレイアウト:layout/details.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/detail_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> </FrameLayout>
※リスト画面のレイアウトはプログラム内で作ってしまうのでいらない
アクティビティの作成
これがなかなか面倒くさい。ApiDemosにあるソースを拝借して必要な部分のみ記述した。
package com.sample; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends FragmentActivity { private static final String[] ITEMS = { "A", "B", "C" }; private static final String[] DETAILS = { "ラテン文字(アルファベット)の1番目の文字。小文字は a 。ギリシャ文字のΑ(アルファ)に由来し、キリル文字のАに相当する。", "ラテン文字(アルファベット)の2番目の文字。ギリシャ文字のΒ(ベータ)に由来する。小文字は b 。キリル文字のБ、Вと同系である。", "C は、ラテン文字(アルファベット)の3番目の文字。小文字は c 。" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_layout); } /** * ポートレイト(縦向き)のアクティビティ */ public static class DetailsActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // ランドスケープ(横向き)モードの場合、このアクティビティはいらない finish(); return; } if (savedInstanceState == null) { // フラグメント(右ペイン)を作成 DetailsFragment details = new DetailsFragment(); details.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); } } } /** * 左のペイン */ public static class TitlesFragment extends ListFragment { boolean mDualPane; int mCurCheckPosition = 0; int mShownCheckPosition = -1; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // リストの作成 setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_checked, ITEMS)); // デュアルモードかどうかを確認 View detailsFrame = getActivity().findViewById(R.id.details); mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE; if (savedInstanceState != null) { // 前回の選択位置を取得 mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); mShownCheckPosition = savedInstanceState.getInt("shownChoice", -1); } if (mDualPane) { getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); showDetails(mCurCheckPosition); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice", mCurCheckPosition); outState.putInt("shownChoice", mShownCheckPosition); } @Override public void onListItemClick(ListView l, View v, int position, long id) { showDetails(position); } void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // デュアルモードの場合は選択されているアイテムをハイライト getListView().setItemChecked(index, true); if (mShownCheckPosition != mCurCheckPosition) { // 別のアイテムが選択されたら対応する画面を作成 DetailsFragment df = DetailsFragment.newInstance(index); // トランザクションを開始して既存のフラグメントと入れ替える FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, df); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); mShownCheckPosition = index; } } else { // デュアルモードではない場合、詳細画面を起動 Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); startActivity(intent); } } } /** * 右のペイン */ public static class DetailsFragment extends Fragment { public static DetailsFragment newInstance(int index) { DetailsFragment f = new DetailsFragment(); // リストに対応するインデックスを仕込む Bundle args = new Bundle(); args.putInt("index", index); f.setArguments(args); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { // ポートレイトでリスト画面の場合は詳細画面を作らない return null; } View view = inflater.inflate(R.layout.details, null); TextView textView = (TextView) view.findViewById(R.id.detail_text); textView.setText(DETAILS[getArguments().getInt("index", 0)]); return view; } } }