読者です 読者をやめる 読者になる 読者になる

コンパイラかく語りき

文系新卒プログラマーのメモ

cpp 日本語文字列についてメモ

C++

言語100本ノックに挑んだら、いきなりつまづいてしまった

 

www.cl.ecei.tohoku.ac.jp

 

"パトカー"の出力ができていないさそう。なにやら文字化けが表示される。ひょっとしたら文字コード周りの問題か…?

 

マルチバイト文字列とワイド文字列

そもそも、cppの文字列にはマルチバイト文字列とワイド文字列が存在するらしい。

 

C/C++での日本語文字列の扱い、どうすればよいか - minus9d's diary

 

マルチバイトとか文字コードとか…あまり得意ではない…。ので、軽く調べてみた。

 

・マルチバイトとは従来のchar型みたいに1Byte文字と2Byte文字を分けて考える概念のこと
ユニコードとはWCHAR型の様に日本語や中国語やアルファベットや数値などを区別無く扱う概念のこと

 

charとUnicodeとワイド文字をごっちゃにしないために

 

なんてわかりやすい…。

 

ワイド文字列にはwstring

 

上記の記事では、char[] strw = L"こんにちは" と、文字型の配列を利用している。個人的にはstringを使っていきたいので、もうちょっと調べる。

 

どうやらwstringというものがあるらしく、これを使えばワイド文字列を扱うことができる。

 

wstring - C++ Reference

 

しかも、使えるメソッドはstringと同じ。

 

つまり、string にせよ、wstring にせよ、そこに含まれる機能はどちらも std::basic_string が提供しているものですから、 まったく同じ使い方ができます。

 

Programming Place Plus C++編【標準ライブラリ】 第2章 string

 

それと、Lや_Tのような標準マクロを使ってリテラルを宣言できます。

 

ちなみにユニコード設定でもマルチバイト設定でも両方で通用するようにプログラミングするには

char * text = "文字列";
とか
WCHAR * text = L"文字列";
という書き方ではどちらか片方に限定した書き方なのでダメです。
TCHAR * text = _T("文字列");
と書くのが正解です。

 

なんて分かりやすい解説。

 

wstringを使うときはLが必要なときがあります

 

普通にstringで良かった

ここまで書いておいてアレですが、wstringをごにょごにょといじっていたところ、stringで良いことに気づいた

 

string型の変数に代入した"パタトクカシーー"自体は出力されていた。問題は、添字でのアクセスができていないことだった。

 

gistd4ca5fabb1497b7aac2d2be3b760559e

 

自分の環境ではUTF-8がデフォルトだったらしく、文字コードについて悩む必要はそもそもありませんでした。コンパイラやcppのバージョンにも寄るんでしょうけど。

 

そもそも、今時は多バイトunicodeが標準な気がするので(要調査)、2バイトunicodeのワイド文字列は不適切かもしれませんね。すくなくとも、100本ノックをこなすレベルでは、必要なさそうでした。

 

添字アクセスするには…?

ICUというライブラリを使えば、以下のように書けるようです。

 

gist7003eeb1a669bd5568299006b58cfd6f

 

Unicode string indexing in C++ - Stack Overflow

Python3で標準入出力(競技プログラミング用)

Python 競技プログラミング

最近Pythonデビューをした者です。 手始めに競技プログラミングで素振りをしようかなと。まずは入出力のお勉強。

単純な入出力

gistd81cb35385f34d5b0e127a5b4dfc85ff

入力の型

gistca87e0960b731deba07e1ff0c7d5782e

1行データの分割

gistafc68ac34d7db66f39071f71e05eb4aa

複数行の入力

gist3b54862ef4079ba91b532913fd153876

以上、個人メモでした。

参考記事

C++ 文字列が全て同じ文字で構成されているかどうか調べる

C++

std::string::find_first_not_of を使う。

 

string::find_first_not_of - C++ Reference

 

find_first_not_ofは指定した文字以外が最初に見つかった位置を返す。

指定の文字が見つからなかった場合はstring::nposを返すので、nposと比較(==)することで「文字列が全て同じ文字かどうか」を調べられる。

 

サンプル

gist12153a033cd5f0ace90d2246eea218bd

WebStormのターミナルで、rvmのPATHが通っていなかった

すみません、ひょっとしたらWebStorm関係ないかもしれません。少なくとも、自分のWebStorm環境で発生したので便宜的に「WebStormのターミナルで、rvmのPATHが通っていなかった」となりました。

発端

いつものようにrails開発を始めようとしたところ、

$ rails s

以下のメッセージが。

Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.

おや? railsがインストールされていないとのこと。

ちなみに、WebStormの内蔵ターミナルでの出来事でした。 そんなことあるかと思い、色々調べてみたら、WebStormのターミナルだからじゃないかと。

試しに、iTerm2で同じことを。

$ rails s

安心のWEBrick起動。

=> Booting WEBrick
=> Rails 4.2.6 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server

PATHが通ってなかった

ためしに、PATHが正しいか調べる。

$ echo ${#PATH}

正常なiTermでは、結果は290。WebStormのターミナルでは、167でした。パスが足りてない…?

WebStormの方では、以下のPATHが通っていませんでした。

/Users/chuck/.rvm/gems/ruby-2.3.0/bin:
/Users/chuck/.rvm/gems/ruby-2.3.0@global/bin:
/Users/chuck/.rvm/rubies/ruby-2.3.0/bin:

たしかに、これではrailsが無さそう。

rvm系のPATHが通す

どうやら、↓の1文がrvm系のPATHを通しているっぽい。

$ source "$HOME/.rvm/scripts/rvm"

参考:RVM 経由で Ruby を入れるときにハマったこと

先の1文を zshrc に追加することで、解決。(bashをお使いの方はbashrc に。) WebStormのターミナルを再起動すると、$ rails s が成功しました。

そもそも、なぜこんなことが起こってしまったのか、次回調べてみたいと思います。

nodebrew install でsyntax errorが出たら、nodebrew install-binaryを試す

Node.js

nodebrew install したら、syntax errorが出てインストールに失敗した。

 

hasen.hatenablog.com

 

Pythonのバージョンが違うのかなと思って調べてみたら、確かに3系を使っていた。

ところがpyenvで2系に戻してみても、install時にsyntax error。結果は変わらず。

 

調べてみたところ、nodebrewのissueがヒット。

 

github.com

 

nodebrew intall-binary

 

でインストールできました。

 

We recommend you to use install-binary command to install.

そもそもREADMEに↑のように、書いてありますね。

 

ちなみに、install-binary コマンドなら、python3系のままでもNodeがインストールできました。

Qiitaの"俺たちはJavaScriptの非同期処理とどう付き合っていけば良いのだろうか"をやってみる

JavaScript

非同期周りにまだ慣れてない感じがあったので、素振りです。

 

こちらの記事をただただ写経しました。

qiita.com

 

書いたコードはこちらに。

github.com

 

Promiseにまだまだ慣れていないなと感じたので、改めて噛み砕いてQiitaに投稿しました。

qiita.com