komoto / エンジニアブログ

プログラミングについてアウトプットします。

【Word】Wordの左下にある文字数カウントは単語数カウントだった

最近、文字数制限がある文書を書くことがありまして、その時にWordを使っていました。
で、そのWordで文字数カウントをしていたら実際の文字数と違うことに気がつきました。

f:id:tkmt-hrkz:20200523222111p:plain

そこでこの原因を調べていたら

Wordの左下にあるあのカウントは実は単語数をカウントしている。

とのこと。

さらに詳しく調べたところ

  • 全角英数字は1文字を1単語として数える(つまり、そのまま文字数カウントになる)
  • 全角文字(日本語かな、漢字など)は全角英数字と同様
  • 半角英数字は1つの意味ある文字列を1単語として数える(appleで1単語)
  • 半角かな・カナは全角文字と同様だけど、濁点・半濁点も1文字として数えるみたい?

つまりすべて全角で書く場合は、文字数=単語数になるから意識する必要はありません。
しかし半角を混ぜて書く場合は、少し注意が必要ですね。

例えば、「私はappleを買った」という例文があるとします。

これの文字数は普通なら11文字です。
しかし、Wordの左下にあるカウントは7文字と数えるでしょう。

ちなみに文字数を確認したい時はWindowsであれば、Ctrl + Shift + Gで確認できます。

ごめんなさい、MACのショートカットキーは分からないです。

皆さんもWordの文字数カウントを使う時には注意してください。
これは、設定か何かで変えられるのかな?

【Markdown】はてなブログのMarkdownでソースコードのタイトルを付ける

はてなブログとQiitaでいくつか記事を書いていて思ったのが、
Qiitaだと ```python:tilte.py```ソースコードを囲めば、タイトルを付けられるのですが、はてなブログだと付かないこと。

なので、はてなブログMarkdownを使うときにソースコードにタイトルを付ける方法を調べてみました。

そしたら、すでにCSSで実装してくださっている方がおられましたので、その方の記事を載せておきます。

ちなみに実装すると次の通りQiitaのように見やすく表示されます。

5/23追記
このCSSが正常に動作するのは、PCで見るときです。
スマホで確認しましたが、スマホですとタイトルは表示できないみたいです。
お気を付けください。

print('Hello World')

itouuuuuuuuu.hatenablog.com

【django】raise ValidationErrordeで指定したエラーメッセージを表示する

pythonの通常のtry, exceptの例外処理とは違っていて例外検出とその内容の表示に詰まったので、記録に残しておきます。

今回はフォームやモデルでバリエーションチェックする場合に、独自のバリデーションチェックに引っかかったときのエラーメッセージの表示について記事にしたいと思います。

簡単な状況説明

OpenCVを使って簡単なBlur(ぼかし)フィルタ機能を開発していて、ユーザからフィルタサイズを入力してもらって、その値から効果強度(フィルタの大きさ)を決めようと思いました。

そこで、Formクラスを使ってフォームを作りましたが、ガウシアンフィルタを使ったため入力された値が偶数だとエラーがでます。

ここから、Formクラスに「入力された値が偶数ならエラー処理する」という独自のバリエーションチェックを作ろうと考えました。

ソースコード

間違っていたら、ごめんなさい。 models.pyはあまり気にしなくてもいいです。

app_name = 'app'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]
class Image(models.Model):
    img_src = models.ImageField(upload_to=get_upload_to)   
def is_oddnumber(value): #奇数かどうかをチェックする関数
    if value % 2 == 0:
        raise ValidationError('偶数を入力してください')
class Form(forms.ModelForm):
    class Meta:
        model = Image
        fields = ('img_src')

    filter_size = forms.IntegerField(
        required=True,
        max_value=100,
        min_value=1,
        validators=[is_oddnumber], #追加で上のis_oddnumberでバリデーションチェックを行う
    )
class IndexView(generic.TemplateView)
     
    template_name = index.html
    
    def get(self, request, *args, **kwargs):
        form = Form()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = Form(request.POST, request.FILES)
        if form.is_valid():
             return redirect(○)
        return render(request, self.template_name, {'form': form}) #エラーメッセージを含んだフォームをセットして再表示
<form action="{% url 'app:index' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
</form>

{% if form.errors %}
<ul>
    {% for error in form.non_field_errors %}
    <li>{{ error }}</li>
    {% endfor %}
</ul>
{% endif %}

raise ValidationErrorの引数であるエラーメッセージはform.errorsに格納されるみたいです。

そのため、バリエーションエラーが発生した場合は、エラーメッセージをform.errorsに含んだformをrenderとかで再度表示しなおしてやれば、形としては画面遷移なしにエラーメッセージを表示できます。