丁寧に手を抜く

頑張らない努力

iPhoneケースで経年変化を楽しむ

f:id:craftzdog:20180923162310j:plain

自分の好きなコンセプトに「経年変化」が挙げられる。英語ではPatina(パティーナ)と呼ぶ。

デジタルの世界ではなかなか味わいにくい要素だ。 ビットはいつだって0か1しか表現しないからだ。 それでも、使い込むことで手に馴染む感覚や、蓄積されたデータがもたらす新たな発見、時間をかけてカスタマイズした設定も、一つの経年変化と呼べるだろう。 なぜなら、それらは一人ひとり違う結果をもたらすからだ。 自分の作っているノートアプリも、経年変化が味わえるアプリの一つだと思っている。

ところで、新しく買ったiPhone XSはゴールドを選んだんだけど、正直いってあまりときめかなかった。 色味が思ったより落ち着いていてピンクがかっている。あまり好みではない。これなら白か黒を選べばよかった。 あと、テーブルに置いた状態で操作すると、背面の出っ張ったカメラが隙間を作って、タップするたびにガタガタ鳴って揺れる。 この2つの不満点を解決すべくケースを買うことにした。

選んだのはApple謹製のレザーケース。 色はサドルブラウンを選んだ。

www.apple.com

レザーだから、使い込んでいくうちに色味が変わって味が出る。 スマホのケースにレザーを選んだのは初めてなので、その経年変化が楽しみでしょうがない。

Oliurというロンドンのデザイナーが、同じケースを8ヶ月使い込んだ結果をYouTubeで紹介していた。 これがかなりかっこいい。傷すら味になるのがレザーの良さか。

www.youtube.com

最低でも1年は使うから、変化を見るためにも記録として今の状態を写真で残しておこうと思う。

f:id:craftzdog:20180923164730j:plain

エッジに埃が溜まりやすいかも

下の写真をご覧になると分かるが、ケースの高さがiPhoneのサイズよりも大きめに作られているので、画面を包み込むように少しはみ出ている。

f:id:craftzdog:20180923164742j:plain

f:id:craftzdog:20180923164816j:plain

この出っ張りは落とした時に画面を守ってくれそうな利点がある反面、少し使った感じではこの隙間に埃がたまりやすい。 なので、定期的にはずして掃除してやる必要がありそうだ。

10万以上もする高級品だから、大事に使いたいと思う。 8ヶ月後が楽しみだ。

iPhone XSはスマホ付きカメラだ

どうもTAKUYAです。

今日、11万円もするカメラが届いた。iPhone XSっていう名前の。

これがめっちゃ薄型で、撮った写真を確認する用の画面はなんとedge-to-edgeの全面タッチパネルで、贅沢にもOLEDが使われている。

さっそく手近なものを撮ってみた:

いいボケ感。この被写界深度は撮った後でも調整できる。前代未聞。もうちょっとボカしたかったなぁなんて事が無くなる。

なんでそんな事ができるかと言うと、カメラなのにもの凄い高性能のA12 BionicっていうCPUを搭載していて、独自のAI技術によって被写体と背景を識別しているからだそうだ。カメラのためにそこまでやるか。

雨だし夜だけど、さっそく公園に出かけてちょっと撮ってきた。

結構暗かったのにノイズも少ない。街灯の色が白飛びせずに、はっきり分かる。

撮ってその場でインスタみたいなフィルタがかけられる。パソコン要らない。

街灯に照らされて金色に輝く地面。

現実で見た感動をより確かに伝えられる。 素晴らしいカメラだ。


冗談はこの辺にしておいて、今日届いたiPhone XSのカメラを試したというお話でした。

カメラの凄さについてはアップルのキーノートでも10分弱かけて熱弁していた。

このレベルまで来たら本当にカメラ市場も大きく侵食するだろう。先日以下のようにツイートした:

実際使ってみて、自分はもうコンデジ買わなくていいやと思えた。

久しぶりにデジタルデバイスで感動した。

やはりスマホは楽しい。

Raspberry Piとgo言語で部屋のコンディションを記録してグラフ化した

自分のプロダクトばかり作っていると技術の幅も狭まってしまうので、定期的に趣味がてら題材を見つけて普段使わない技術に触れている。

自分にとってベストな部屋のコンディションが知りたい

今回は兼ねてからやりたかった、自分の部屋の温度や湿度などのコンディションを数分ごとに記録してグラフで可視化すること。 体調と空気の質は関連が深い。 気圧が低いと頭痛を起こす人もいるし、ジメジメしていると汗が気になって仕方がないという人もいるだろう。 そういう関係性を客観的に調べられたら、自分にとって最もパフォーマンスが出る条件がわかる。 まずはともあれ記録をとってグラフ化するところから始めようというわけだ。

使用機材

f:id:craftzdog:20180213103545j:plain

まだ届いていないけど、CO2センサーをAliExpressで買ったので、それも追々組み込む予定。

Go言語でセンサーデータを取得してCloud Firestoreに格納する

Go言語は前々から気になっていた言語。 やはりチュートリアルをやっただけではしっくりこないので、こういう実用的な題材で組むと一気に理解が進む。

Cloud Firestoreも気になっていたGoogleクラウド向けデータベース。 PouchDBみたいにオフライン同期に対応している点が面白い。 ちょっと複雑なクエリやComposite Indexingにも対応している。 まだBeta段階のようだけど、完成度は申し分なく、問題なく使える。

今回のプロジェクトを通して、この2つの技術と仲良くなりたい。

センサーデータの取得

ANAVIのセンサーキットにはサンプル集GitHubで公開されている。 これをそのまんま使って、実行結果をGolangによる簡単な文字列処理を経由してデータを取り出す。 例えばBMP180センサーのデータは以下のように取得する:

package sensors
// Temperature and Pressure sensor

import (
    "log"
    "os/exec"
  "strings"
  "strconv"
)


func GetTempAndPressure() (temperature float64, pressure float64, err error) {
    out, err := exec.Command("/home/pi/anavi-examples/sensors/BMP180/c/BMP180").Output()
    if err != nil {
        log.Fatal(err)
    }

  s := string(out[:len(out)])
  lines := strings.Split(s, "\n")
  lineTemp := lines[1]
  linePress := lines[2]

  tempStr := strings.Split(lineTemp, ": ")[1]
  temperature, err = strconv.ParseFloat(tempStr[0:len(tempStr)-2], 32)
  pressStr := strings.Split(linePress, ": ")[1]
  pressure, err = strconv.ParseFloat(pressStr[0:len(pressStr)-4], 32)

  return
}

Firestoreへの格納

各センサーの取得スクリプトが書けたら、以下のようなmainスクリプトを書いてFirestoreに記録する:

package main

import (
  "./sensors"
  "log"
  "time"
  "context"
  firebase "firebase.google.com/go"
  "google.golang.org/api/option"
)

type RoomData struct {
  temperature float64
  pressure float64
  humidity float64
  light float64
}

func recordData (roomData *RoomData) {
  ctx := context.Background()
  opt := option.WithCredentialsFile("<YOUR-SERVICE-ACCOUNT-KEY.json>")
  app, err := firebase.NewApp(ctx, nil, opt)
  client, err := app.Firestore(ctx)
  if err != nil {
    log.Fatal(err)
  }
  collection := client.Collection("conditions")

  _, _, err = collection.Add(ctx, map[string]interface{}{
    "createdAt": time.Now(),
    "humidity":  roomData.humidity,
    "light":  roomData.light,
    "pressure": roomData.pressure,
    "temperature": roomData.temperature,
  })
  if err != nil {
    log.Fatalf("Failed adding alovelace: %v", err)
  }
}

func main () {
  log.Println("Start capturing my room confitions")

  temperature1, humidity, _ := sensors.GetTempAndHumid()
  log.Printf("Temperature:  %f C\n", temperature1)
  log.Printf("Humidity:     %f %%rh\n", humidity)

  light, _ := sensors.GetLight()
  log.Printf("Light:        %f Lux\n", light)

  temperature2, pressure, _ := sensors.GetTempAndPressure()
  log.Printf("Temperature:  %f C\n", temperature2)
  log.Printf("Pressure:     %f %%rh\n", pressure)

  data := RoomData{
    temperature: temperature1,
    pressure: pressure,
    humidity: humidity,
    light: light,
  }

  recordData(&data)
  log.Println("Finished recording data!")
}

あとは3分ごとにこいつを実行するようにcronで設定すれば完成。 Firebaseのコンソールからデータが正しく記録されていることを確認する:

f:id:craftzdog:20180904154019p:plain

グラフ描画webフロントエンドを作る

デスクトップとモバイルのChromeで動けばよしとする。 最近はアロー関数が動くのでメソッドチェーンが書きやすい。 シンプルなプログラムなのでbabelもwebpackも使わず、Vanilla JSで行く。

ひとまず完成図がこちら:

f:id:craftzdog:20180904154436p:plain

とてもいいんじゃないでしょうか!

グラフはhighcharts.jsを使用。 Mixpanelとかでも使われているグラフ描画ライブラリ。 とても簡単にハイクオリティなグラフが書けるのでオススメ。 非商用利用なら無料。

ソースは以下のような感じ:

HTML:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>Craftzdog&apos;s Room Conditions</title>

    <script src="lib/highcharts.js"></script>
    <script src="lib/dark-unica.js"></script>
    <script src="lib/moment.min.js"></script>
    <script src="lib/moment-timezone-with-data-2012-2022.min.js"></script>

    <script src="lib/firebase-app.js"></script>
    <script src="lib/firebase-auth.js"></script>
    <script src="lib/firebase-firestore.js"></script>

    <link rel="stylesheet" href="lib/semantic.min.css" />
    <link rel="stylesheet" href="lib/semantic-icon.css" />
    <link rel="stylesheet" href="./app.css" />
  </head>
  <body>

    <div class="ui container">
      <h1 class="align center">My Room Conditions <i class="home icon"></i></h1>
      <div class="ui stackable grid">
        <div id="temperature" class="eight wide column" style="width:100%; height:400px;"></div>
        <div id="humidity" class="eight wide column" style="width:100%; height:400px;"></div>
        <div id="pressure" class="eight wide column" style="width:100%; height:400px;"></div>
        <div id="light" class="eight wide column" style="width:100%; height:400px;"></div>
      </div>
    </div>

    <script src="./app.js"></script>
    <script>
      retrieveData().then(data => {
        renderChart(data)
      })
    </script>
  </body>
</html>

JS:

// Initialize Firebase
var config = {
  apiKey: '****',
  authDomain: '***.firebaseapp.com',
  databaseURL: 'https://***.firebaseio.com',
  projectId: '***',
  storageBucket: '***.appspot.com',
  messagingSenderId: '***'
}
firebase.initializeApp(config)
var db = firebase.firestore()
const settings = { timestampsInSnapshots: true }
db.settings(settings)
db.enablePersistence().catch(function(err) {
  if (err.code == 'failed-precondition') {
  } else if (err.code == 'unimplemented') {
  }
  console.error('Failed to enable persistence:', err)
})

window.retrieveData = function() {
  var conditions = db.collection('conditions')
  return conditions
    .orderBy('createdAt', 'desc')
    .limit(300)
    .get()
    .then(querySnapshot => {
      var items = []
      querySnapshot.forEach(doc => {
        items.push(doc.data())
      })
      items = items.map(item => {
        return Object.assign({}, item, {
          temperature: item.temperature - 1.4,
          humidity: item.humidity + 8.2
        })
      })
      return items.reverse()
    })
}

window.renderChart = function(items) {
  const lastItem = items[items.length - 1]

  const basicOptions = {
    time: {
      timezone: 'Asia/Tokyo'
    },
    xAxis: {
      type: 'datetime'
    },

    legend: {
      layout: 'vertical',
      align: 'right',
      verticalAlign: 'middle'
    },

    plotOptions: {
      series: {
        label: {
          connectorAllowed: false
        },
        pointStart: 2010
      }
    },

    responsive: {
      rules: [
        {
          condition: {
            maxWidth: 500
          },
          chartOptions: {
            legend: {
              layout: 'horizontal',
              align: 'center',
              verticalAlign: 'bottom'
            }
          }
        }
      ]
    },

    theme: {
      chart: {
        backgroundColor: {
          linearGradient: { x1: 0, x2: 1, y1: 0, y2: 1 },
          stops: [[0, '#2a2a2b'], [1, '#2a2a2b']]
        }
      }
    }
  }

  Highcharts.theme.chart.backgroundColor = {
    linearGradient: { x1: 0, x2: 1, y1: 0, y2: 1 },
    stops: [[0, '#2a2a2b'], [1, '#2a2a2b']]
  }
  Highcharts.setOptions(Highcharts.theme)

  Highcharts.chart(
    'temperature',
    Object.assign({}, basicOptions, {
      title: {
        useHTML: true,
        text:
          '<i class="thermometer icon"></i> Temperature: ' +
          lastItem.temperature.toString().substr(0, 4) +
          ' ℃'
      },
      yAxis: {
        title: {
          text: '℃'
        }
      },
      series: [
        {
          showInLegend: false,
          name: 'Temperature',
          data: items.map(item => [
            item.createdAt.seconds * 1000,
            item.temperature
          ])
        }
      ]
    })
  )

  Highcharts.chart(
    'humidity',
    Object.assign({}, basicOptions, {
      title: {
        useHTML: true,
        text:
          '<i class="tint icon"></i> Humidity: ' +
          lastItem.humidity.toString().substr(0, 4) +
          ' %rh'
      },
      yAxis: {
        title: {
          text: '%rh'
        }
      },
      series: [
        {
          showInLegend: false,
          name: 'Humidity',
          data: items.map(item => [
            item.createdAt.seconds * 1000,
            item.humidity
          ])
        }
      ]
    })
  )

  Highcharts.chart(
    'pressure',
    Object.assign({}, basicOptions, {
      title: {
        useHTML: true,
        text:
          '<i class="sun icon"></i> Pressure: ' +
          Math.round(lastItem.pressure) +
          ' hPa'
      },
      yAxis: {
        title: {
          text: 'hPa'
        }
      },
      series: [
        {
          showInLegend: false,
          name: 'Pressure',
          data: items.map(item => [
            item.createdAt.seconds * 1000,
            item.pressure
          ])
        }
      ]
    })
  )

  Highcharts.chart(
    'light',
    Object.assign({}, basicOptions, {
      title: {
        useHTML: true,
        text: '<i class="lightbulb icon"></i> Light: ' + lastItem.light + ' lux'
      },
      yAxis: {
        title: {
          text: 'Lux'
        }
      },
      series: [
        {
          showInLegend: false,
          name: 'Light',
          data: items.map(item => [item.createdAt.seconds * 1000, item.light])
        }
      ]
    })
  )
}

Future Work

今後はこれらのデータをもとにして、

  • 一日の平均、max、minの表示
  • 体調が良かった日、悪かった日の記録
  • アラート機能 (気圧が低すぎるとか)

などを追加していきたい。

脱ステ脱保湿のアトピー治療でいい感じに治ってきた

f:id:craftzdog:20180820151019j:plain

どうもTAKUYAです。前回のアトピー治療の話からしばらく経ったので近況を報告したいと思う。

前回のあらすじ:

  • 仕事のストレスが原因だと思っていたけどどうやら違う
  • 本を読んで、自分は「ステロイド依存性皮膚症」である事を知る
  • ステロイドが対症療法でしかないどころか、むしろ体の免疫を弱めていることが判明
  • アトピーはそもそも自然に治る病気だから、何もしないのが一番
  • ステロイド・脱保湿の自然療法を始める
  • 薬と保湿をやめたことによって起こるリバウンド症状がとても辛いが、がんばって耐える
  • 藤澤重樹先生の生活指導に従って出来るだけ早く治るように努める

脱ステ脱保湿を始めてから2ヶ月弱が経った。 結論から言うと、辛いリバウンド症状のピークは越えた。 今は徐々に症状が治まりつつある状態。 倦怠感もほとんど無くなり、仕事への集中力も少しずつ戻ってきた。 何より寒気が無くなったので、クーラーの効いた電車や室内にいてもガタガタ震えなくて済むようになったのが嬉しい。

症状の変化の例

症状が悪化しているのか回復しているのかを客観的に評価できるように、数日ごとに各部位の写真を撮って記録した。 その結果、リバウンド症状とはどのように発生してどのように落ち着いていくのかが分かる貴重なデータが取れた。

ここでは顔を例にとって紹介したいと思う。恥ずかしいけど、誰かの参考になれば幸いだ。ちょいグロなので大丈夫な人だけ以下のリンクを開いてほしい。

各写真の下には、脱ステ脱保湿を始めてからの日数が示してある。

  • 6〜8日目: 口の周りがとても荒れて口が開けないほどに痛くなった。ほとんど吸うようにしてご飯を食べていた。
  • 10〜16日目: カサカサになり皮がめくれて白くなる症状が顔全体に広がる。これをフレーク現象という。16日目がピーク。先生は「いい感じだねぇ〜」と仰っていた。そう、これは治るためには必要不可欠な「過程」であり、悪化ではないのだ。見た目はひどいものだが、皮膚は必死に再生しようとしている証拠なのだ。喜ぶべき変化。
  • 18〜28日目: フレークが徐々に減る
  • 〜47日目: 赤みが少しずつおさまる。

そして現在、まだ口の周りに少しフレークが残って、痒みもあるが、プロトピック軟膏などの薬や保湿を一切しなくても肌の状態を保てるようになった。嬉しい。

人によっては腫れたりするみたいだけど自分は幸いそんなことは無かった。

顔は代謝速度が速いからなのか、一番最初に症状が落ち着いた。 まだ他の部位は炎症が残っている。でも滲出液はほぼ出なくなって乾いたし、あとは痒みに耐えつつゆっくり回復を待つのみだと思われる。

リバウンド症状の程度や長さは、ステロイドの強さや処方期間によるとされている。 先生によると、自分は治るのが結構早いらしい。 確かに、ネットの脱ステ体験ブログなどを読んでみると、ピークを越えるのに最低3ヶ月は要している。 おそらく、以降で書く生活改善施策を徹底してやったからだと思う。 ただ脱ステ脱保湿を闇雲にやっているだけでは、時間を無為に過ごすことになるから注意が必要。

リバウンド症状で自分のステロイドホルモンを蘇らせる

ここで、なぜリバウンド症状が起こるのか説明しておきたい。

ステロイドとはホルモンの一種で副腎または表皮細胞から分泌されるもの。 環境の変化に応じて必要な量を適切に分泌して体の免疫や血糖、血圧などのバランスを保っている。 ステロイド剤を皮膚に塗ると体内に吸収されて一ヶ月かけて体から抜けていく。毎日塗っていると常に体内にステロイド剤が体の中に溜まることになる。 すると、自分の本来のステロイドホルモンがさぼってしまって、自己調節力が衰える。

このような状態でステロイド剤をやめると、ステロイド剤が一ヶ月かけて徐々に抜けていく一方で、ホルモンの自己調節力が弱っているので当分の間ステロイド不足が続く。 それがリバウンド症状を引き起こす。

ステロイドホルモンはその状態の「間違い」に気づき、徐々に自己調節力を取り戻していく。 自然療法は、サボってしまったステロイドホルモンの本来の働きを取り戻す療法なのだ。 上記の例で紹介したように、多少時間はかかるものの、自分でステロイドを分泌できるようになったら、外用も内服もする必要はなくなる。

脱保湿も同じ原理で、外から保湿するもんだから本来の保湿能力がサボってしまう。 ただでさえ元から乾燥肌なのに、自分の保湿能力を甘やかすことによって事態をより悪化させているのだ。 こんな話がある。日本は高温多湿なのに対してヨーロッパはカラッとしているので、移住したばかりのころは肌がとても乾燥する。 でも保湿クリームなどに頼らずそのまま過ごしていると、肌が適応して潤ってくるのだという。 自分の本来の保湿能力を取り戻すために脱保湿が重要。

また、保湿することによってリバウンド症状を長引かせてしまう。 痒いけど、出来るだけ皮膚を乾燥させて代謝を促進させる必要がある。 見た目が悪いからといってマスクや手袋などで隠すと反って保湿になってしまうから、何もつけないで堂々と外に出よう。 あなたはあなたのままで充分素晴らしい存在なのだから何も隠す必要はない。

リバウンド症状を乗り越えるための生活習慣

藤澤先生の生活指導は、辛いリバウンド症状をできるだけ軽くして、早く終わらせる効果がある。 もらった資料や指示を要約してここに紹介したい。

糖質制限とケトン体生活で抗炎症化

一日の摂取糖質量を 40g 以下に抑える。かなり厳しめの糖質制限だが、徹底しなければならない。 お米、小麦をはじめ、砂糖、イモ類など糖質の多い食べ物を取り除いていく。 できればスーパーの惣菜などは買わずに自炊する。 おいしく制限するにはMEC食がおすすめ。MEC食とは、ミート・エッグ・チーズを中心とした食生活のことで、渡辺信幸医師が提唱している。 いくつか書籍が出ているのですぐに始められる。

肉食やせ! ―肉、卵、チーズをたっぷり食べるMEC食レシピ111

肉食やせ! ―肉、卵、チーズをたっぷり食べるMEC食レシピ111

なぜ糖質制限が大事なのかというと、糖質を取ることによる血糖値スパイクが炎症を引き起こすからだ。 つまり、糖質を摂ると血糖値が急激に上がり、それを抑えるために膵臓からインシュリンが過剰分泌される。 すると体内に大量に活性酸素(細菌感染などによって起こる炎症やアレルギー性炎症反応を促進する酸化力のある酸素)が産生されて、様々な血管へのダメージを与える。 糖質制限によってこの血糖値スパイクによる活性酸素の産生を軽減させる。

人の主なエネルギー源は糖だけではなく、脂質由来のケトン体というものがある。 例えば赤ちゃんはケトン体を主なエネルギー源として生きている。 人類が農耕を始める以前、狩猟採集をしていた時代はこのケトン体を主なエネルギーとして生きてきたと言われている。 ケトン体は、ブドウ糖と同じく血液脳関門を通過して、副作用や毒性がなく、抗炎症、抗老化、抗糖化、抗酸化、抗がん化作用がある。 心筋や神経が保護され、抗不安作用で精神が安定する。

ケトン体についての詳しい話は以下の書籍で学ぶことが出来る。

糖質制限によって体内のケトン体を増やして、活性酸素を減らして抗炎症作用を享受する。 これが辛いリバウンド症状を和らげてくれるというわけだ。

糖質制限(ケトン体効果)をナメてはいけない。 別の患者さんの話で、いい感じに症状が抑えられてきた時に、間違えて甘栗を大量に食べてしまったらしい。 すると数日後に症状がぶり返して、大変なことになったそうだ。 それぐらい効果がでかい。

運動!運動!運動!

汗をかいてとにかく新陳代謝を上げる。 ただでさえ運動不足で鈍った体を鍛えて、基礎代謝を上げる。 そうすれば皮膚の新陳代謝スピードも上がり、回復が早まる。

自分は出来る限り毎日6キロジョギングして、3キロウォーキングしている。 雨で外に出られない時は、座布団の上で足踏みを30分間している。 EDMとか適当に流しながらやるとテンションが上がって続けやすい。

アスリートにアトピー無し

体をあまり洗わない

毎日お風呂に入り、体をゴシゴシ洗うのは良くない。 身体を守ってくれる常在細菌を洗い流してしまうからだ。 ただでさえ乾燥肌なアトピー患者は、そもそも汗をかいたってすぐに乾いてサラサラになるし、別に臭ったりもしない。汚れにくい体質なのだ。 自分の汗・垢・皮脂をもっと大切にして、皮膚バリアを保つ必要がある。

チベットの人は一ヶ月に一度しか風呂に入らないが、アトピーはゼロだそうだ。 毎日風呂に入らなければならないというのは、ただの先入観にすぎない。

先生はタモリ式入浴法を推奨している:

この入浴法は、ただ湯船にぬるめのお湯をためて10分間半身浴するだけ、というもの。 それだけで汚れの80%は取れるとタモリ氏は言っていて、医学的にも理にかなっていると評価されているらしい。

自分は結局症状がひどい時は一切風呂に入らずに過ごした。 流石にジョギングで汗をかいて気持ち悪いと感じた時はシャワーでサッと流すだけにとどめた。 それだけで十分スッキリしたし、体臭も気にならなかった。

とにかく自分の皮膚バリアを取り戻すことに集中することが大事。

自律神経を整える

イライラしたり焦ったり緊張したり、何かしらストレスを感じると痒くなる経験がある人は多いだろう。 これは、ストレスを感じると自律神経の交感神経が優位に傾くため。 自律神経が体に及ぼす影響はとても大きく、現代人は何かと交感神経に過剰に傾きすぎる傾向がある。 それがどのように痒みにつながるかというと、次の通り。

白血球は、血液中をめぐって異物から体を守っているが、細かく分類すると 顆粒球、リンパ球、マクロファージの3つの免疫細胞がある。 このうち、顆粒球は異物を取り込み、みずからが持つ分解酵素活性酸素によって処理する。 顆粒球の数と体内に侵入してくる細菌のバランスがいいときは何も問題はないが、あまり細菌がないのに、交感神経が過剰に優位になることで顆粒球が増えすぎてしまうと、健康維持に必要な常在菌まで殺してしまい、かえって免疫力を下げることになる。 また、使われない顆粒球が残ってしまうことも問題。 顆粒球の寿命は二~三日と短いうえ、顆粒球は死ぬときに、持っていた「活性酸素」をばらまいて細胞を傷つけてしまうから。

以上の理由から、交感神経と副交感神経のバランスを保つことが大事。 その最も効果的な方法は、焦らずおちついて「ゆっくり動作」を心がけること。 時間にも余裕を持って行動して、食事はゆっくりよく噛んで摂る。 呼吸は深くゆっくりと。猫背をやめて姿勢を正すだけで胸が開いて呼吸が深くなる。 そして早寝早起きのリズムを保つ。

自律神経に関する体への影響や、どうすれば副交感神経を優位に保てるかは、小林弘幸氏の以下の書籍が参考になった:

なぜ、「これ」は健康にいいのか?

なぜ、「これ」は健康にいいのか?

普通に健康になるという事

リバウンド症状はとにかく辛い。生きた心地がしない。 孤独だし、周りの理解やサポートが必要。

  • 強い倦怠感の中、立ち上がってスーパーに買物に行くことができたなら、最大限に自分を褒めてやろう。
  • 汗をかくと体中が痒くなるけど、ジョギングに行けたら、「おつかれ自分!」と労ってやろう。
  • フレークが発生したら「自分の体が治ろうとしている!」と前向きにとらえて、フレークが収まってきたら「自分の体すごい!」と褒めてやろう。

痒みは大人であっても我慢できるものではない。藤澤先生は掻くなと言わない。 何度も掻き壊してしまっても、皮膚は不思議と徐々に強くなっていく。

そうやって少しずつ変化する体と向き合っていくうちに、ピークは乗り越えられる。

自分もまだ普通の生活が送れるようになった訳ではないけど、ゴールが見えてきたのでかなり気が楽になった。 久々に母親と電話したら、「あんた、明るくなったな」と言われた。 たぶん毎日運動しているお陰だと思う。 7kgも痩せて体脂肪率は5%。もともと痩せ型だったので、学生時代の体型に戻った。 この治療を通じて、アトピーだけでなく精神も肉体も健康に生まれ変わっているのを感じている。

夜ぐっすり寝て、朝ちゃんと起きられる事。 そんな普通の健康な生活が、当たり前じゃないという事。 俺は取り戻すぞ。

アトピー治療に専念している

ひじょーに個人的な内容。 持病のアトピー完治に向けて、脱ステロイド・脱保湿の自然療法に挑戦していて、今日で35日目。 徐々にだけどリバウンド症状を乗り越えて回復しつつある。

ステロイドが悪夢の根源

以前、30連休を宣言して取った:

blog.craftz.dog

この休みの裏目的は、持病のアトピー性皮膚炎を完治させることだった。

徐々に悪化傾向にあること、少し追い込みをかけると容易に悪化すること、強い薬を処方されていること、その薬を塗る負担、通院の負担、全てがもう我慢出来ないレベルに達しようとしていた。

それまで、自分のアトピーの主な原因は「仕事のストレス」なんじゃないかと思い込んできた。

もともと中学生ぐらいから顔が赤く腫れて痒い症状はあった。 でも全身に渡って湿疹が出来たのは、8年前に就職して上京してしばらく経った時が初めてだった。 そして近所の皮膚科に行って、ステロイドを出してもらい、一旦は落ち着くものの、外用を中止するとまたぶり返すということが起きるようになった。 それからはずっとステロイドが手放せなくなり、症状は徐々に徐々に悪化して薬の強度も増していくことになるのだった。 いくら塗っても治らない。焦りと不安を感じた。しまいには飲み薬の最強級ステロイドまで出されるようになった。 通院先の先生も「ストレスですね。仕事を休めば治りますよ」と言っていた。

30連休では、とにかくストレスを取り除くことに努めた。 色んな本を読んでは試して、一定の効果が得られた(これはまた別でネタにしたい)。 そうしてリラックスした日々を送れていたはずなのだけど、肝心のアトピーの症状は一向に良くならないではないか。 20日目ぐらいを迎えたあたりで、自分は本質的になにか間違えているんじゃないかと思い始めて、いろいろアトピーの治療法について調べ始めた。 すると色々と驚愕なことがわかった。 以下の書籍が特に参考になった:

9割の医者が知らない 正しいアトピーの治し方

9割の医者が知らない 正しいアトピーの治し方

これによれば自分のような成人型アトピーの正体は、「ステロイド依存性皮膚症」ということだ。

ステロイド依存性皮膚症は、ステロイドがあって初めて皮膚がまがりなりにも機能するが、それがなければ普通には機能できない状態 - 阪南中央病院皮膚科部長 佐藤 健二 医師

自分はステロイドを長期間塗布してきたことによって、皮膚のバリア機能が弱まり、その結果炎症に悩まされてきたのだった。本末転倒だ。 詳しい原理的な説明は同書籍に譲るとして、いかにステロイドが意味のない対処であるかが読めば分かる。

ステロイド・脱保湿に踏み切る

ステロイドがダメならどうすれば良いかというと、答えは「何もしない」だった。 アトピーというのは本来、自然治癒するものなのだ。 だから何も薬を塗らないし、保湿もしない。 そして体が本来持っている免疫力やバリア機能を取り戻して、炎症を少しずつ治していく。

ただし、長期間ステロイドを使い続けた人が突然中止すると、激烈に皮膚症状が悪化するリバウンド症状が待っている。 これが成人アトピー患者が乗り越えなければならない最も大きな試練。 肌がゾンビ化するし、正気を失うレベルの痒さだし、辛すぎて挫折する人も一定数いる。 とても忍耐と根性の要る治療法だ。

今後ステロイドには希望が微塵も見えないので、ここは覚悟を決めて脱ステロイド・脱保湿に挑戦することに決めた。 これが 6月28日 のことだった。

藤澤重樹先生の病院に通う

実はさっきの書籍の著者・藤澤重樹 先生のやっておられる藤澤皮膚科は練馬区大泉学園前にある。 なんという幸運…電車で4,50分で行ける距離にあった。 中には名古屋など遠方から通っている人もいるという。 さっそく診察を受けてみることにした。

予約制ではないので待ち時間がすごかった。

一連の事情を説明すると開口一番、「うーん、(脱ステ始めるのが)遅い!」と一喝された。笑

前の医者は薬を出すことしか考えてくれなかった事などいろいろ悩みを打ち明け、話を聞いてもらった。

そして、リバウンド症状を最小限に抑えつつ出来るだけ短期間で終わらせるための生活習慣の指導を受けた。 意外だったのは、糖質制限すること。糖質が炎症の大きな原因になっているらしい。 ブドウ糖ではなくケトン体を主なエネルギー源として生活していくことになる。 そして毎日運動して新陳代謝を上げること。

話の最中にいろいろプリントを渡された。口頭での説明を省くための資料のようだ。 この病院はインフォームド・コンセントを掲げているので、その一環なのだろう。 資料はとてもわかり易く、たまに読み返している。

動けない日々をなんとか乗り越えた

この一ヶ月は生きた心地がしなかった。まだ終わってないが。

徐々に悪化する症状。

顔が今まで見たこともないようなゾンビみたいになるし。

体液が滲み出て汚いし。

自律神経が一時的に狂うので、強い倦怠感と寒気に襲われる。

立ち上がると貧血症状が起こったり。

それでも生活するためにスーパーへ出かけて食材を買う。 他人に怪訝な目で見られても無視だ。 気にする必要はない。 俺は今必死で生きている。

毎日ジョギングを 3〜6 km。 ウォーキングを更に3 km。

糖質制限と毎日の運動で、体重と体脂肪率が以下のように激減した:

  • 体重: 62.2kg → 56.2kg (-6kg)
  • 体脂肪率: 12.9% → 5.2% (-7.7%)

腹の肉が全く無くなった。

f:id:craftzdog:20180803151849j:plain

そんな中、アプリの更新も一度だけ出来たし、ブログも一本書けた。

今回は仕事は休まない。むしろ、動けそうなら作業をする。その方が気も紛れていい。

自炊をがんばる

糖質制限はまじで効果がある。でも惣菜や加工品はたいてい砂糖が入っているから避けなければならない。だから自炊をがんばることになる。

以下のレシピ本がとても参考になった:

ケトン体でやせる&健康になる!味付け冷凍ストック・レシピ。 (マガジンハウスムック)

ケトン体でやせる&健康になる!味付け冷凍ストック・レシピ。 (マガジンハウスムック)

肉や魚にあらかじめ下味をつけて冷凍保存しておく手法は目からウロコだった。

実際に作ったご飯:

f:id:craftzdog:20180803152438j:plain

豆腐チャンプルー

f:id:craftzdog:20180803152456j:plain

シーザーサラダ (油揚げをトースターでカリカリに焼くことでクルトンの代用にするアイデアは脱帽もの)

f:id:craftzdog:20180803152617j:plain

BLTエッグ

こんな感じで、おいしく糖質制限が出来ている。まぁ、料理がちょい手間だけど治療のためだから文句言ってられない。

これらはここ数日つくったもの。だいぶ倦怠感が減ってきたかもしれない。

アトピーが治ったらまじで生産性が二倍になる

薬を塗る時間、通院の手間が今後なくなることを考えると、相当な無駄が省ける。 薬なしでも生活できるから、気軽に長期の旅行にも出られるようになる。

そうなった時の自分には、おそらくこれまでとは全く違う世界が広がっていると思う。 たったの数ヶ月我慢するだけで、文字通り人生が変わる。 こんなコスパのいい投資は無い。 だからやりきりたいと思う。

先生によればあと一ヶ月ぐらいでリバウンド症状は治まるだろうとのこと。 「信じます!」と言うと、先生は「信じるっつても、勝手に治るもんだからねぇ〜」と苦笑していた。 なんとも人を前向きにさせてくれる人柄の先生だなと思った。

ffmpegで動画を綺麗なgifに変換するコツ

先日、gifで動くモックアップ動画を作ってツイッターに投稿した。

英語でも同様のツイートをしたら以下のような質問が来た。

意訳: 「まじヌルヌル動くやん、どうやってんの?俺も前試してんけど無理やってんわー」

という訳でこちらにもティップスをシェアしたい。彼には既に伝えたので安心してほしい。

無料ツールのffmpegを使う

ffmpegというのは有名なフリーの動画変換CLIツール。一度知ったら手放せない。 macだったらhomebrewでインストールできる:

brew install ffmpeg

もっとも基本的な使い方は以下の通り:

ffmpeg -i input.mp4 output.gif

input.mp4output.gif に変換している。簡単や。

パラメータの調整が必要

しかし問題は、適切なパラメータを指定してやらないと綺麗に変換されないということだ。

以下は特に何も最適化せずに動画を変換した場合のアウトプット:

ffmpeg -i input.mov -lavfi "fps=12,scale=900:-1:flags=lanczos" -t 5 -y output.gif

f:id:craftzdog:20180713174417g:plain

  • fps=12, width=900, length=5s, size=445KB

なんかブツブツのパターンが見える。使えないこともないけどなんか違和感がある。

パレットを最適化する

gifは256色しか表示できない。なので、動画内で使われている色をあらかじめ計算してパレットを生成する。

ffmpeg -i input.mov -vf "palettegen" -y palette.png

これで palette.png というファイルが出来た。 このパレットファイルを使用して生成してみると・・

ffmpeg -i input.mov -i palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y output.gif

f:id:craftzdog:20180713175101g:plain

  • fps=12, width=900, length=5s, size=1.3MB

スムース! あとはお好みのfps(フレームレート)やサイズを指定すればOK。 なぜファイルサイズが倍以上に増えたのかは、gifの仕様に詳しくないので分からない。

コマンド内で指定している謎の各パラメータはおまじないなので気にしなくてもOK。もしもっと凝った事がしたいなら、以下で紹介している参考元記事をどうぞ。

参考記事

ミルチャ・カントル展で「透明な主張」を読み取る @ 銀座エルメス

エルメスの建物なんてそうそう入らないのでとてもいい機会だ。

f:id:craftzdog:20180621194729j:plain

かっこいいオブジェがお出迎え。建物の外壁全面が、昭和な建物によく使われている格子状ガラスで作られている。すごい。

f:id:craftzdog:20180621194901j:plain

f:id:craftzdog:20180621194906j:plain

中から写すとこんな感じで、異空間な雰囲気がすてき。エフェクト無しです。

f:id:craftzdog:20180621195709j:plain

近くで撮ると、外の風景がぐにゃっと歪んで面白い。エルメスは時空の歪みの中に存在する。

さて、本題のミルチャ・カントル展はというと、展示物は2つ。

まずひとつ目は沢山の鉄製風鈴のようなものを吊るした作品。

f:id:craftzdog:20180621195128j:plain

実は入り口のドアとワイヤーで繋がっていて、ドアを開くと風鈴が揺れて音が一斉に鳴るという仕組み。

f:id:craftzdog:20180621195133j:plain

最初は気付かないで入るので、二度美味しい。

f:id:craftzdog:20180621195307j:plain

二つ目は映像。透明のプラカードを掲げて更新する様子がずっと映し出される。

f:id:craftzdog:20180621195408j:plain

謎すぎて意味がわからないけど、そこが良いなと思えた。

まるで「声なき声」を可視化したようなメッセージ性を感じた。

声の大きい者が目立ってばかりの時代を逆説的に批判するかのような。

f:id:craftzdog:20180621195614j:plain

三者三様の表情で立っているのが面白い。

スタッフの応対がエルメスすぎて緊張した。最高級や。


しかし銀座は少し歩くだけでユニークな建物に出会えて面白い。

f:id:craftzdog:20180621200005j:plain

f:id:craftzdog:20180621200011j:plain

f:id:craftzdog:20180621200015j:plain

f:id:craftzdog:20180621200022j:plain

よい散歩でした。