コンビニ人間 ー村田沙耶香 ー文藝春秋

コンビニ人間の画像
これはたしかにヤバイ。絵が見えるようで、いきなり笑える。
本人がギャグだと思っていないボケが一番おもしろい。
気持ちわるい面もあるが、誰もが抱いているけど、常識に気を使って言わないことを言ってくれてスッキリする。
何かに自分を最適化すると生きやすくなるのはたしかである。
大丈夫なのかと他の作品も読みたくなる効果がある。

坂の途中の家 ー角田 光代 ー朝日新聞出版

sakanotocyu
 角田光代さんは、ネチャーと粘り着くような感じがつらくて、どちらかというと避けていた。
小説を読んで一番、惹きつけられる体験は「この作家はどうして自分のことをこんなに知っているのだろう」という体験である。
 この作品の場合、乳児虐待死亡事件の補充裁判員に選ばれた主人公が被告に自分を投影してしまう。被告と同じく育児の最中であるからだ。ぐずる子供にキレたり、あたったりする自分と被告を重ね合わせて、疑心暗鬼になり、自信を失っていく。
 子供を死に追いやってしまう瞬間と寝顔に「ごめんね」と謝る時間の分岐点はどこにあるのか。
 被告の心のありように主人公の不安が重なってにじみ、雨雲のようにどんよりと広がっていくので多くの子育て中の女性が 「どうして自分のことを知っているのだろう」と共感するだろう。
孤独感や孤立感は周りに人がいても感じることがある。自分のストレートな感情をぶつけることができる相手がいないのである。小さな子を育てながら、スマートで大人な態度を取り続けることはできないだろう。
 三人の子供たちが小さかったころのことを思い出した。私にアレルギーがあるので、免疫力がつくようにと妻は母乳で子供を育てくれた。乳腺炎で39度の熱がでたこともあった。おっぱいマッサージが痛い。チョコレートや生クリームが食べられない。
 次男はおっぱいを吸う力が弱かった。長男が熱性けいれんを起こしたので、病院につれていったら「知能の発達に遅れがないか」と聞かれた。「全くない。どちらかというと早い」と答えたときには力が入っていた。子供の成長には、個人差があってしかるべきなのに保健師になになにが遅いと言われると不安を感じた。ちゃんと育つようにとアドバイスをくれているのに、なにか自分に落ち度があると非難されているような気になる。
 角田光代、恐るべしである。同時に、妻に感謝したくなった。

 ちなみに今日の新聞の一面には、虐待対策に「産後うつ予防へ助成」という記事が載っていた。
 

staph(スタフ) ー道尾秀介 ー文藝春秋 

カバー+オビ
道尾秀介さんはあまり読まないのですが、これは一気に読んでしまいました。たまに文体に読みにくさを感じるのですが、お話は面白かったです。中学生や中学生をお持ちのお父さん、お母さんに読んでほしい作品です。
ちなみに、staphとはブドウ球菌のこと。

擬宝珠のある橋 ー宇江佐真理 ー文藝春秋

擬宝珠のある橋
髪結い伊三次シリーズ最終章です。龍之介も伊与太も大きなってしまいました。
長く読ませてもらいましたが、もう続きを読むことはできません。残念です。
ほかの作品だと、人の良いおじさんやら「卵のふわふわ」など消化に良さそうな食べ物が出てくる話が好きでした。
宇江佐真理さん、ありがとうございました。

Xamarin、ザマリン、青空、晴れた空 -Xamarinで次世代mobile版データベースRealmを使う-

 こちらのサイトのメロディーとともにお楽しみください。

 Realmは、SQLite+ORMに変わるモバイルデータベースです。Realmは、NoSQLデータベース(非リレーショナルデータベース)ですので、オブジェクトを生成して手軽に永続化できます。
 現在、RealmはAndroidとiOSに対応しているので、Xamarinで使ってみます。Build Insiderに掲載されているXamarinでSQLiteを使うコンパクトなサンプルと同様なアプリをXamarin.Forms Portableで作成してみます。
 まず、Visual StudioでXamarin.Forms Portableなプロジェクトを作成します。
useRealm1
作成したら、NuGetパッケージマネージャで、realmを検索してインストールします。
 
 最初にModelクラスを作ります。グループ名だけを記録するGroup.csです。

using Realms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UseRealmApp
{
    public class Group : RealmObject
    {
        [ObjectId]
        public string ID { get; set; }
        public string Name { get; set; }
    }
}

 Realmにはいわゆるオートインクリメントな値を振る機能はありませんので、IDもStringにしてGUID値を記録することにします。
 次ぎにデータベースを操作するMemoDatabaseクラスを作成します。将来的にGroupクラスだけでなく、メモを記録するクラスなどを追加していくのでMemoDatabaseというクラス名にしました。
 GetGroups()メソッドはGroupクラスの全オブジェクトを取得します。GetGroups()メソッドの戻り値をListViewに表示します。GetGroupは指定したIDのオブジェクトを取得します。以降のメソッドについてはソースコードの下に解説を記します。

using Realms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UseRealmApp
{
    public class MemoDatabase
    {
        Realm realm;
        public MemoDatabase()
        {
            realm = Realm.GetInstance();
        }
        public IEnumerable<Group> GetGroups()
        {
            return realm.All<Group>().ToList();
        }
        public Group GetGroup(string id)
        {
            return realm.All<Group>()
                        .ToList()
                        .FirstOrDefault(x => x.ID == id);
        }
        public string SaveGroup(Group group)
        {
            var newGroup = realm.All<Group>()
                             .ToList()
                             .FirstOrDefault(x => x.ID == group.ID);

            using (var trans = realm.BeginWrite())
            {
                if (newGroup == null)
                {
                    newGroup = realm.CreateObject<Group>();
                    newGroup.ID = Guid.NewGuid().ToString();
                }

                newGroup.Name = group.Name;
 
                trans.Commit();
            }

            return newGroup?.ID;    // ? Nullable型
        }
        public string DeleteGroup(string id)
        {
            var item = realm.All<Group>()
                             .ToList()
                             .FirstOrDefault(x => x.ID == id);

            if (item == null)
                return null;

            using (var trans = realm.BeginWrite())
            {
                realm.Remove(item);
                trans.Commit();
            }

            return id;
        }
    }
}

 SaveGroupメソッドはオブジェクトを保存します。usingでトランザクション処理を囲みます。DeleteGroupメソッドは指定したIDのオブジェクトを削除します。

 app.csでページを表示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace UseRealmApp
{
    public class App : Application
    {
        public App()
        {
            MainPage = new MyPage();
        }
    }
    class MyPage : ContentPage
    {

        readonly MemoDatabase _db = new MemoDatabase();

        public MyPage()
        {

            var listView = new ListView
            {
                ItemsSource = _db.GetGroups(), 
                ItemTemplate = new DataTemplate(typeof(TextCell)) 
            };
            listView.ItemTemplate.SetBinding(TextCell.TextProperty, "Name");
            listView.ItemTapped += async (s, a) => {
                var group = (Group)a.Item;
                if (await DisplayAlert("削除してよろしいですか", group.Name, "OK", "キャンセル"))
                {
                    _db.DeleteGroup(group.ID); // groupの削除
                    listView.ItemsSource = _db.GetGroups(); // リストの更新
                }
            };
            var entry = new Entry
            { 
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            var buttonAdd = new Button
            {
                WidthRequest = 60,
                Text = "追加"
            };
            buttonAdd.Clicked += (s, a) => { 
                if (!String.IsNullOrEmpty(entry.Text))
                { // Entryに文字列が入力されている場合に保存
                    var group = new Group { Name = entry.Text };
                    _db.SaveGroup(group);
                    listView.ItemsSource = _db.GetGroups(); //リストの更新
                    entry.Text = "";
                }
            };

            Content = new StackLayout
            { 
                Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0),
                Children = {
                    new StackLayout {
                        Padding = 5,
                        Orientation = StackOrientation.Horizontal,
                        Children = {entry, buttonAdd} 
                    },
                    listView 
                }
            };
        }
    }
}

 ListViewにはグループ名を一覧表示し、タップしたら削除確認のダイアログを表示します。
useRealm2
 Entryにグループ名を入力して追加ボタンをタップしたら、データベースに記録してListViewを更新します。
useRealm3
 XamarinでもRealmを簡単に使うことができました。