2017-07-20

iPadをメインマシンとしてWEBサイトを作成・更新できるか?

私はiPadが大好きなのでもちろんiPad Proの2017年モデルも買いました。

ちょっと意外に思われるかもしれませんが、サイズは10.5インチではなくて12.9インチを買いました。

以前は9.7インチのiPadを使っていたのですが、Apple Pencilが出てからは、完全にiPadがデジタル教科書、デジタルノートと化してしまって、線を引いたり書き込みをしながら本を読んだり、勉強をしたりするのにほとんどiPadしか使わなくなりました。

紙の本とかノートを使うことが本当になくなって、限りなく100%に近いくらいペーパーレスを実現することができています。

単に本を読むとかウェブサイトを見るとか映画を見るとかビューアとして使うだけなら9.7インチとか10.5インチでも十分なんですけど、デジタル教科書、デジタルノートとして使うとか、何らかの作業をするとなると断然12.9インチが使いやすいです。

特にスプリットビューを使った時に12.9インチの恩恵を受けることができます。

新しいiPad Pro 12.9インチを使ってみて感じるのはiPadをメインマシンとして使えるようになってきているということです。

2017年がMacBookとかノートPCが本格的に消えていくスタートになるような気がします。

iOS11ではファイラーアプリのFilesが実装されるらしいので、iOS11が使えるようになる2017年の秋が楽しみです。

本格的にiPad Proをメインマシンとして使っていくために、ウェブサイト(ホームページ)の制作、更新、管理をできるだけiPad Proでやってみようと考えて試行錯誤しています。

いろいろやり方を考えたのですが、現状でかなり満足できる環境が整ってきたので、私なりのやり方を紹介させていただきますので、興味のある人は参考にして下さい。

結論から言うと、iPad Pro、Smart Keyboard、Apple Pencilといくつかのアプリがあれば、iPad Proはウェブサイトを制作するためのメインマシンになります。

私の場合、iPadだけでサイトを制作したり更新したりするわけではなくて、メインで使っているiMacやサブマシンとして使っているMacBook Proも使っているので、ローカルのデータの整合性を取るためにそれらのマシンでローカルデータを共有する必要があります。

iPadを使う前はiMacとMacBook Proだけだったので、いろんなデータを入れているAppleのAirMac Time Cupsuleにデータを保存してそこに両方のマシンからアクセスしていました。

具体的に言うとソフトはDreamweaverを使っているので、ローカルサイトフォルダーをAirMac Time Cupsuleのそれぞれのフォルダに設定していました。

iPadで使うhtmlエディタは1,200円で販売されているTextasticというアプリを使っているのですが、そのアプリからは残念ながらAirMac Time Cupsuleに接続できませんので(もしかしたらできるのかもしれませんが、私はやり方が分かりません)、そのやり方ではローカルデータをiPadで共有することができません。

となると、iPadでローカルデータを変更した場合にその続きの作業を別のiMacなどでやろうとするとかなりめんどくさいことになってしまいます。

なので別の方法を取らないといけないのですが、幸いにもTextasticはデフォルトでiCloudをローカルデータに設定することができるようになっているのでそれを使ってやってみることにしました。

iCloudは無料だと5Gまでしか使えなくて全然足りないので、月額130円を払って50Gに容量を増やしました。

月額130円で50G使えて、ウェブサイトのローカルデータをiPadを含めた複数マシンで共有できるのだったら安いと思います。

容量を増やしたところで、AirMac Time Cupsuleに保存していたサイトのデータを全部iCloudのTextasticのフォルダーに全部移しました。

そしてiMacとMacBook ProのDreamweaverのローカルフォルダも全部iCloudの方に変更しました。

これでiCloudをウェブサイトのローカルデータの保存場所としてiMac、MacBook Pro、iPad Proの全てで共有することができましたので、どのマシンからデータを変更しても全てのマシンに反映されます。

Textasticは(S)FTP接続にも対応していますのでhtmlやcssを変更した後で、サーバーにアップロードすることもできますし反対にダウンロードすることもできます。

これでかなり快適にiPad Proだけでもウェブサイトの制作、更新、管理ができます。

今、この記事を読んでいてiPadでウェブサイトを作ってやろうと考えているような人にはFTPの設定とかアプリの細かい使い方の説明なんて要らないと思うのでそういう細かい事はあえて省略させていただきます。

また、私はPythonをメインに使っていますが、iPadでPythonを書く時はPythonistaというアプリを使っています。

iOS11でファイラーアプリが実装されればPythonistaで作ったスクリプトも簡単に連携させることができそうなので、そうなるとiPadだけでも本格的なWEBサイトの開発もできるようになりそうです。

ProcreateとApple Pencilでイラストとかを描いて、Pythonistaでスクリプトを作って、Textasticでhtmlとかcssをコーディングして、ファイラーアプリでそれらのデータを管理できるなんて事になれば、楽しくてiPadがますます手放せなくなるし、完全にメインマシンとして使えますよね。

むしろApple Pencilが使える事を考えるとiMacやMacBook ProなんかよりもiPad Proの方が優れているかもしれません。

これからiOS用のアプリがどんどん充実してくるでしょうし、たぶんタブレットがノートPCに完全に取って代わるという時代があと数年で来るような予感がします。

iCloudって今まで全然使ってなかったけど、めちゃくちゃ便利ですね。

iCloudをローカルデータの置き場所にしている事になってますけど、本当は全然ローカルじゃなくてどこかの遠いサーバーに保存されているんですよね。

なのに本当に自分のパソコンとかiPadにデータがあるように超高速にアクセスできます。

ちなみにTextasticはiPadだけでなくiPhoneでも利用できるので、Bluetoothキーボードを持ち歩けばiPhoneでもホームページを作ったり更新することができます。

2017-03-13

GAE(Python 2.7) + Django 1.5 + SSLのcron jobsで301エラー

独自ドメインを使ってGoogle App Engineで運用しているサイトがあって、cronがうまく動かずにかなりハマりました。なんとか解決できたので、私がやった解決法を書いておきます。

同じような症状でエラーが出ている人はあまりいないと思いますが、もし当てはまったら参考にして下さい。

環境はだいたい以下のとおり。

  • Google App Engine
  • Python 2.7
  • 独自ドメイン(カスタムドメイン)で運用
  • SSL対応
  • Django 1.5

設定はうまくできてるはずなのにcron jobsが起動すると失敗するという症状が出ました。

ブラウザで直接URLを入力すると問題なく動いているのに、cronで動かすとなぜか失敗になってしまいます。

ログを調べてみるとcronでのアクセスのHTTPステータスコードが301になっている。他方でブラウザでURLを入力してアクセスした場合には200になっている。

GAEのcron jobsは、HTTPステータスコードを200番台で返さないとエラーになるということは知ってたので、301が返ってきている以上は失敗するというのは分かります。

でも、なぜ301リダイレクトになるのかが全く分かりませんでした。

かなり苦労して分かった原因は、Djangoのsettings.pyのMIDDLEWARE_CLASSESに設定していたSSLRedirectの設定でした。

そんな設定をしてたのをすっかり忘れてたけど、グーグルが全てのサイトでSSL対応することを推奨し始めた数年前に自分で設定してたのです。

せっかくSSL対応したのだからセキュリティのためとSEOのためにhttpに来たアクセスを自動で全てhttpsに301リダイレクトするために、sslmiddlewareを設定していたのです。

参考URL

具体的にはDjangoのsettings.pyのこの部分です。


MIDDLEWARE_CLASSES = (
    .........
    .........
    'appname.middles.sslmiddleware.SSLRedirect',
)

cron.yamlにターゲットを設定をしてない場合、cronが起動するとデフォルトのバージョンのURLにアクセスが発生します。

このデフォルトのバージョンというのは、ログを見てみると独自ドメインで運用している場合でも、最初に与えられるドメインであるappspot.comの方です。

しかも、httpsではなく、httpの方にアクセスが発生します。

例えば、以下のような設定で独自ドメインを使っている場合。

  1. デフォルトのドメイン(http) -> http://appname.appspot.com/
  2. デフォルトのドメイン(https) -> https://appname.appspot.com/
  3. 独自ドメイン(http) -> http://www.appname.com/
  4. 独自ドメイン(https) -> https://www.appname.com/

1と2は最初にデフォルトで与えられるドメインで、httpでもhttpsでもどちらでもアクセスできるようになっていると思います。

私の場合はそれに独自ドメインを設定して、SSL対応しているので4を中心に運用しています。

先ほどのsslmiddlewareを使って、3のhttpへのアクセスを全て自動的に4のhttpsの方に301リダイレクトしていました。

この様な設定の状態の時にcronが起動すると、1の指定したパスにアクセスが発生します。

するとsslmiddlewareによって自動的に2のhttpsの方に301リダイレクトが発生してしまうのです。

これが原因で、cronが失敗していたのです。

これを解決するためには、cronで起動するパスに対してだけ301リダイレクトをさせないという設定をする必要があります。

urls.pyにcronで起動させるパスを記述して、新たに別のssl_urls.pyというファイル作って残りを全て分離してそちらに移しました。

そして、分離したssl_urls.pyをincludeで呼び出し、それに{'SSL':True}を設定しました。

これでcronで起動させるパスに対しては301リダイレクトが生じずに、それ以外のパスに対しては301リダイレクトが生じるという設定になります。

このように設定してようやくcronで動かしても200が返ってきて無事に動きました。

urls.pyはこんな感じです。


urlpatterns = patterns('',
    # Cron
    (r'^cron/example/$', cron_example),
    (r'^cron/........),
                       
    # SSL
    (r'^.*?', include(appname.ssl_urls), {'SSL':True}),
)

注意が必要なのは「r'^.*?',」の部分です。最後に$が要りません。最後に$をつけるとどこのパスにアクセスしてもトップページが表示されるというおかしな事になってしまいました。

結局、すごく簡単で単純な事が原因だったので、同じような失敗をしている人はほとんどいないと思いますが、参考にしてみて下さい。

2016-10-08

macOS SierraでPython3のインストールができない場合の対処法

高校数学もまともに勉強してこなかったレベルの私ですが、中学数学から勉強し直しながらディープラーニングの勉強をしています。

運のいい事にオライリーから「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」という本が出てたので、それを読みながらコツコツコードを書いて動かしています。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ただ、この本はPython3で書かれていて、メインで使っている環境がPython2の私にとっては色々と問題が出てきました。

サイトを運営するのにGoogle App Engineをメインで使っていて、GAEがPython3にまだ対応してないために未だにPython2系を使っているという事情があります。

私と同じような人がいるかもしれないので、問題が出てくるたびに一応記事にしていこうと思います。

今回は、macでPython3のインストールができない場合の対処法です。

Python2のままやろうと思ったのですが、色々と不都合が出来てきたのでPython2とPython3を切り替えて使えるようにしようと思いました。

そこでpyenvを使ってPython3をインストールしようとしたら、以下のようなエラーが出て失敗。


~$ pyenv install 3.5.1
Last 10 log lines:
  File "/private/var/folders/96/6vlfqmzs7yj57x663b30_d100000gn/T/python-build.20161008050732.27594/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in 
    ensurepip._main()
  File "/private/var/folders/96/6vlfqmzs7yj57x663b30_d100000gn/T/python-build.20161008050732.27594/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/96/6vlfqmzs7yj57x663b30_d100000gn/T/python-build.20161008050732.27594/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/96/6vlfqmzs7yj57x663b30_d100000gn/T/python-build.20161008050732.27594/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

調べて見るとxcode-selectというのをインストールするとできるらしいという事で、早速インストール。

参考:http://qiita.com/maosanhioro/items/bf93540515d4ea75b222


xcode-select --install

するとウィンドウが立ち上がるので、気にせずにインストールを続行します。

インストール出来たら再度Python3のインストールに挑戦。


Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...
Installed Python-3.5.1 to /Users/minoru/.pyenv/versions/3.5.1

すると無事にインストールすることが出来ました。

2016-07-09

NLTKのFreqDistオブジェクトのkeys()メソッドで頻出単語がソートされない

オライリーの入門自然言語処理のP.19で文章の中からもっとも頻出する50の単語を取り出すコードが記載されているけど、なぜかうまくソートされない。

調べてみるとNLTK3では頻出順にソートされなくなったようで、同じことをしたければmost_common()メソッドを使わなければならない。


    fdist1 = FreqDist(text1)
    vocaburary1 = fdist1.keys()
    print vocabulary1[:50]

オライリーのサンプルコードは上のようになっているけど、これだと頻出単語順にソートされていない。

mosot_common()を使って以下のように変更する。


    fdist1 = FreqDist(text1)
    print fdist1.most_common(50)

するとうまく頻出単語順にソートされて表示される。


[(u',', 18713), (u'the', 13721), (u'.', 6862), (u'of', 6536), (u'and', 6024), (u'a', 4569), (u'to', 4542), (u';', 4072), (u'in', 3916), (u'that', 2982), (u"'", 2684), (u'-', 2552), (u'his', 2459), (u'it', 2209), (u'I', 2124), (u's', 1739), (u'is', 1695), (u'he', 1661), (u'with', 1659), (u'was', 1632), (u'as', 1620), (u'"', 1478), (u'all', 1462), (u'for', 1414), (u'this', 1280), (u'!', 1269), (u'at', 1231), (u'by', 1137), (u'but', 1113), (u'not', 1103), (u'--', 1070), (u'him', 1058), (u'from', 1052), (u'be', 1030), (u'on', 1005), (u'so', 918), (u'whale', 906), (u'one', 889), (u'you', 841), (u'had', 767), (u'have', 760), (u'there', 715), (u'But', 705), (u'or', 697), (u'were', 680), (u'now', 646), (u'which', 640), (u'?', 637), (u'me', 627), (u'like', 624)]

NLTKは3になってから結構いろいろ変更があるみたいなのでその都度調べながらやらないといけないようです。

2016-07-07

Pythonでエラー:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)が出るときの対処法

最近、またコツコツと自然言語処理の勉強をしています。

PythonでNLTKを使っているといろんなところでこのエラーが出ますよね。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

その度に、encode('utf-8')を使ってみたりunicode()を使ってみたりでその場しのぎをしてきましたけど、今回はどうしてもうまくいかなかった。

そこでオライリーの入門自然言語処理を読んでみるとばっちし対処法が書いてあった。


import codecs, sys

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
sys.stdin = codecs.getreader('utf_8')(sys.stdin)

最初にこれを追加してやると嘘のようにうまくいきました。

NLTKでいろいろやってて文字コードのエラーで困っている人はぜひ試してみて下さい。

入門 自然言語処理

オライリーの本はクオリティに差があるけどいい本は本当にいい。

nltkのnltk.clean_html()を使うと「NotImplementedError: To remove HTML markup, use BeautifulSoup's get_text() function」というエラーが出る場合の対処法

久しぶりにNLTKを使ってライバルサイトの調査をしようとしたら、nltk.clean()の行で以下のエラーが出た。

NotImplementedError: To remove HTML markup, use BeautifulSoup's get_text() function

調べてみるとNLTKのバージョン3以上からはnltk.clean_html()とnltk.clean_url()が使えなくなったらしい。

その代わりにBeautifulSoupのget_text()を使えということらしい。

ただ、BeautifulSoupのget_text()はJavaScriptのタグが除去できません。

だからJavaScriptのコードを除去するコードを自分で追加しないといけません。

探してみるとありました。

自分で以下のclean_htmlという関数を追加しました。

参考:Python nltk.clean_html not implemented - Stack Overflow


def clean_html(html):
    """
    Copied from NLTK package.
    Remove HTML markup from the given string.

    :param html: the HTML string to be cleaned
    :type html: str
    :rtype: str
    """

    # First we remove inline JavaScript/CSS:
    cleaned = re.sub(r"(?is)<(script|style).*?>.*?()", "", html.strip())
    # Then we remove html comments. This has to be done before removing regular
    # tags since comments can contain '>' characters.
    cleaned = re.sub(r"(?s)[\n]?", "", cleaned)
    # Next we can remove the remaining tags:
    cleaned = re.sub(r"(?s)<.*?>", " ", cleaned)
    # Finally, we deal with whitespace
    cleaned = re.sub(r" ", " ", cleaned)
    cleaned = re.sub(r"  ", " ", cleaned)
    cleaned = re.sub(r"  ", " ", cleaned)
return cleaned.strip()

参考にさせていただいたサイトのコメントの部分を見るとどうやら以前のclean_html関数の部分をそのまま持ってきたようですね。

もっと複雑なことをしてるのかと思ったけど、ほんの数行で処理していることにびっくり。

それにしてもめんどくさい。なんで無くなったんだろう。

2013-12-01

入門自然言語処理(オライリー)の演習問題 解答Part1 [第2章1〜]

入門自然言語処理の演習問題を解くシリーズ。

入門 自然言語処理

【第1問】

単語のリストを含んだ変数を作成しよう。その変数に対し、加算、乗算、添字、スライス表記、ソートを試してみよう。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

def main():    
    words = ['apple', 'orange', 'banana']
    print words + ['grape']
    print words * 3
    print words[2]
    print words[:2]
    print sorted(words)

if __name__ == '__main__':
    main()

【第2問】

corpusモジュールを利用して、austen-persuasion.txtを調べてみよう。単語トークンはいくつかるか。また異なり語はいくつかるか。

単語トークンは98,171。異なり語は6,132。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import nltk

def main():
    #print nltk.corpus.gutenberg.fileids()
    persuasion = nltk.corpus.gutenberg.words('austen-persuasion.txt')
    print len(persuasion)
    print len(set(persuasion))

if __name__ == '__main__':
    main()

【第3問】

NLTKのブラウンコーパスリーダーnltk.corpus.brown.words()とウェブテキストコーパスリーダーnltk.corpus.webtext.words()を利用して2つの異なるジャンルのテキストにいくつかアクセスしよう。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import nltk

def main():
    #print nltk.corpus.brown.categories()
    print nltk.corpus.brown.words(categories='news')

    #print nltk.corpus.webtext.fileids()
    print nltk.corpus.webtext.words(fileids='firefox.txt')

if __name__ == '__main__':
    main()

【第4問】

state_unionコーパスリーダーを用いてState of Union addressesのテキストを読み込もう。各ドキュメントについて、men、women、peopleの出現回数を数えよう。それらの単語の使われ方について、時代とともに変化があったかどうかを調べてみよう。

各ドキュメント内のmen, women, peopleの出現回数を出力。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import nltk

def main():
    for file in nltk.corpus.state_union.fileids():
        words = [w.lower() for w in nltk.corpus.state_union.words(fileids=file)]
        freq = nltk.FreqDist(words)
        print '【' + file + '】'
        print 'men=%s, women=%s, people=%s' % (freq['men'],
                                               freq['women'],
                                               freq['people'])

if __name__ == '__main__':
    main()

時代とともに変化があったかどうかを調べるためにグラフにする。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import nltk

def main():
    cfd = nltk.ConditionalFreqDist(
        (target, file[:4])
        for file in nltk.corpus.state_union.fileids()
        for w in nltk.corpus.state_union.words(file)
        for target in ['men', 'women', 'people']
        if w.lower().startswith(target))
    print cfd.plot()

if __name__ == '__main__':
    main()

このようなグラフが表示される。

【第5問】

いくつかの名詞について、ホロニムとメロニムの関係について調べる。ホロニムとメロニムの関係には3種類あるので、member_meronyms()、part_meronyms()、substance_meronyms()、member_holonyms()、part_holonyms()、substance_holonyms()を使う必要がある。

humanでやってみた。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from nltk.corpus import wordnet as wn

def main():
    for synset in wn.synsets('human', wn.NOUN):
        print synset.name + ':', synset.definition
    print wn.synset('human.n.01').member_meronyms()
    print wn.synset('human.n.01').part_meronyms()
    print wn.synset('human.n.01').substance_meronyms()
    print wn.synset('human.n.01').member_holonyms()
    print wn.synset('human.n.01').part_holonyms()
    print wn.synset('human.n.01').substance_holonyms()

if __name__ == '__main__':
    main()

2013-09-27

投資リターンとインフレの関係

みんなインフレ率って気にしていますか?インフレって僕らのお金をどんどん吸い取っていく危険な怪物なんですよ。

とりわけ投資などに興味を持っていない人に多いのですが、インフレ率というのを気にしていない人がほんとに多いです。これって将来にわたって自分の資産形成を考える上でものすごく危険な事です。

投資とか経済の初歩的な本を読めば必ず書いてある事で、初めて知った時には目からウロコが落ちる感覚になって、勉強して良かったと感じる事ができるテーマの1つです。

株式投資とかFXの本とかって薄っぺらいアホみたいな本が多いけど、多くの人から長年高い評価を得ている投資の本というのはやっぱり読むべきだと思います。

例えば、ベンジャミン・グレアムの賢明なる投資家ですよね。これは真剣に投資をしようと考えている人にとっては必読の本です。

ベンジャミン・グレアムという人を知らない人でも、投資の神様であるウォーレン・バフェットの師匠だと言えば、すぐに理解できるでしょう。

ベンジャミン・グレアムは、あのバークシャーハサウェイを率いるウォーレン・バフェットの先生なんですよ。そんな凄い人が書いた真面目な投資の本を読まないなんてもったいないですよ。

新賢明なる投資家 上~割安株の見つけ方とバリュー投資を成功させる方法~《改訂版――現代に合わせた注解付き》

新賢明なる投資家 上~割安株の見つけ方とバリュー投資を成功させる方法~《改訂版――現代に合わせた注解付き》

この賢明なる投資家に、投資の事なんて全く知らない素人でもすぐに理解できるインフレの問題が書いてあったので紹介します。

心理学の世界では「貨幣錯覚(money illusion)」と呼ぶらしいのですが、以下の2つのうちあなたはどちらを好みますか?

  1. 物価が4%上昇した時(インフレ率4%)に、給料が2%アップした。
  2. 物価の変動が全く無かった時(インフレ率0%)に、自分の給料が2%カットされた。

さて、どうでしょうか?

おそらく、ほとんどの人が1番目を好み、2番目を嫌だと感じるでしょう。

でも、これって実は実質的には全く同じなのです。

数字の大きさや単位は現実的ではないですが、分かりやすく説明します。

もし、あたなの月収が1,000円だとします。そしてパン1個の値段が100円だとします。

この場合、あなたはパンを10個買う事ができます。

では、あなたの月収が10%アップして、インフレ率が20%になった場合、パンを何個買えるでしょうか?

あなたの月収が10%アップしたので、月収は1,100円になります。他方でインフレ率が20%なのでパンの値段は120円になります。

すると、1,00÷120=9.16という事で、パンは9個買える事になります。

次に、あなたの給料が10%削減されて、インフレ率が0%だったとします。

あなたの月収は900円になり、パンの値段は100円のままです。

900÷100=9という事で、さきほどと同じくパンは9個買えるという計算になります。

自分の給料が上がると何となく得して資産が増えたような気分になるのですが、実はそれ以上にインフレ率が上昇すると、実質的には給料が減っているのです。

見た目の数字だけ見ると自分のお金が増えたように感じるのですが、お金の本質であるモノやサービスの交換価値という面から考えると自分の財産は減っているのです。

このように錯覚してしまうので、「貨幣錯覚(money illusion)」と呼ばれているのでしょうね。

したがって、自分の老後に向けて投資で確実に資産を増やしていこうと思うと、最低でもインフレ率以上に増加させていかないと実質的にお金は増えないという事です。

見落としがちなインフレですが、本当に要注意ですよ。