スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VPS上のLinuxのユーザー空間にArch Linuxの環境を構築する話(2)

はじめに

まあまずは
VPS上のLinuxのユーザー空間にArch Linuxの環境を構築する話 — 173210's Blog
をみてもらうとして、これをmsys2上からやるときにどうするかという問題がある。

とりあえずそのままでは動かないので手順を書いておく。なおprootはサーバー管理者が上記記事のように入れてくれていることを前提にする。

msys2上での作業

まずこんなファイルを適当な場所に作っておく。

%echo Generating pacman keyring master key...
Key-Type: RSA
Key-Length: 2048
Key-Usage: sign
Name-Real: Pacman Keyring Master Key
Name-Email: pacman@localhost
Expire-Date: 0
%no-protection
%commit
%echo Done
EOF

次に秘密鍵を生成してサーバーに転送する。

$gpg --homedir gnupg --gen-key --batch < tmp.txt
$tar cf gnupg.tar gnupg
$scp -P 110 gnupg.tar yumetodo@kagucho.net:

VPN上での作業

まずはbootstrap用imageを落としてくる。

bootstrap用イメージはArch Linux - Downloadsからテキトーなミラーのリンクを踏めば見つかる. 試しにftp.tsukuba.wide.ad.jpに行ってみると無造作にファイルが置かれた中にarchlinux-bootstrap-2016.11.01-x86_64.tar.gzがあるのでこれを使う.
$ cd ~
$ wget http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/2016.11.01/archlinux-bootstrap-2016.11.01-x86_64.tar.gz -O - | tar xz

proot上のpacman用のmirrorlistを編集する。すでに用意されているmirrorlistのうち近そうなサーバーのコメントアウト(#)を外せば良い。もちろんテキストエディタは好きなものを使えば良い。nanoの場合はCtrl+OEnterすれば保存、Ctrl+Xで終了だ。

$ nano root.x86_64/etc/pacman.d/mirrorlist

先程転送した秘密鍵を展開する。

$ tar -C root.x86_64/etc/pacman.d -xf gnupg.tar

準備が整ったのでprootでArch Linuxを開始するのだが、起動コマンドが長すぎてやってられないので、aliasを貼る。.bashrc

alias 'archlinux=proot -0 -b /etc/resolv.conf -m /dev -m /sys -m /proc -w / -r root.x86_64'

としておく。.bashrcを反映するためにsshし直すとかなんかして、

archlinux

で起動する。

proot上での作業

まずはgpgの初期化をする。

# pacman-key --init
# pacman-key --populate archlinux

さて、ここまでくればmsys2ユーザーにとっては日常だ。

# pacman -Syuu
# pacman -S base-devel git clang openmp gdb lldb

しばらく時間がかかるので放置したのち、動作確認だ。

# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release

Thread model: posix
gcc version 6.2.1 20160830 (GCC)
# g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release

Thread model: posix
gcc version 6.2.1 20160830 (GCC)
# clang -v
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Candidate multilib: .;@m64
Selected multilib: .;@m64
# clang++ -v
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.2.1
Candidate multilib: .;@m64
Selected multilib: .;@m64
# gdb -v
GNU gdb (GDB) 7.12
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
# lldb -v
lldb version 3.9.0 ( revision )
# python --version
Python 3.5.2
# python2 --version
Python 2.7.12
# git --version
git version 2.10.2

試しにhttps://github.com/yumetodo/string_splitでもビルドしてみるか。

# cd ~
# git clone https://github.com/yumetodo/string_split.git
Cloning into 'string_split'...
remote: Counting objects: 310, done.
remote: Total 310 (delta 0), reused 0 (delta 0), pack-reused 310
Receiving objects: 100% (310/310), 50.20 KiB | 0 bytes/s, done.
Resolving deltas: 100% (174/174), done.
# cd string_split/
# git submodule update --init
Submodule 'iutest' (https://github.com/srz-zumix/iutest.git) registered for path 'iutest'
Cloning into '/home/yumetodo/string_split/iutest'...
Submodule path 'iutest': checked out '3db6d7339ad8171cb742ee90bae02fc20cca5ad4'
# make Release -j2
g++ --version
g++ (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

cd test; make Release
make[1]: Entering directory '/home/yumetodo/string_split/test'
g++ --version;
g++ (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++ test.cpp -o test.out -O2 -Wall -Wextra -std=c++14
mkdir -p bin/g++/Linux/Release && cp test.out bin/g++/Linux/Release/test.out
make[1]: Leaving directory '/home/yumetodo/string_split/test'
cd sample; make Release
make[1]: Entering directory '/home/yumetodo/string_split/sample'
g++ --version
g++ (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++ sample.cpp -o sample.out -O2 -Wall -Wextra -std=c++11
mkdir -p bin/g++/Linux/Release && cp sample.out bin/g++/Linux/Release/sample.out
make[1]: Leaving directory '/home/yumetodo/string_split/sample'
cd benchmark; make Release
make[1]: Entering directory '/home/yumetodo/string_split/benchmark'
g++ --version
g++ (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++ benchmark.cpp -o benchmark.out -O2 -Wall -Wextra -std=c++14 -Wunused
mkdir -p bin/g++/Linux/Release && cp benchmark.out bin/g++/Linux/Release/benchmark.out
make[1]: Leaving directory '/home/yumetodo/string_split/benchmark'
# cd test/
# ./test.out
[==========] Running 72 tests from 24 test cases.
[----------] Global test environment set-up.
[----------] 4 tests from ExtractLvalueBySingeCharTest
[ RUN      ] ExtractLvalueBySingeCharTest.type_char
[       OK ] ExtractLvalueBySingeCharTest.type_char (20ms)
[ RUN      ] ExtractLvalueBySingeCharTest.type_wchar_t
[       OK ] ExtractLvalueBySingeCharTest.type_wchar_t (119ms)
[ RUN      ] ExtractLvalueBySingeCharTest.type_char16_t
[       OK ] ExtractLvalueBySingeCharTest.type_char16_t (0ms)
[ RUN      ] ExtractLvalueBySingeCharTest.type_char32_t
[       OK ] ExtractLvalueBySingeCharTest.type_char32_t (0ms)
[----------] 4 tests from ExtractLvalueBySingeCharTest(141ms total)

[----------] 4 tests from ExtractLvalueByCStrTest
[ RUN      ] ExtractLvalueByCStrTest.type_char
[       OK ] ExtractLvalueByCStrTest.type_char (0ms)
[ RUN      ] ExtractLvalueByCStrTest.type_wchar_t
[       OK ] ExtractLvalueByCStrTest.type_wchar_t (0ms)
[ RUN      ] ExtractLvalueByCStrTest.type_char16_t
[       OK ] ExtractLvalueByCStrTest.type_char16_t (0ms)
[ RUN      ] ExtractLvalueByCStrTest.type_char32_t
[       OK ] ExtractLvalueByCStrTest.type_char32_t (1ms)
[----------] 4 tests from ExtractLvalueByCStrTest(1ms total)

[----------] 4 tests from ExtractLvalueByStlStrTest
[ RUN      ] ExtractLvalueByStlStrTest.type_char
[       OK ] ExtractLvalueByStlStrTest.type_char (0ms)
[ RUN      ] ExtractLvalueByStlStrTest.type_wchar_t
[       OK ] ExtractLvalueByStlStrTest.type_wchar_t (0ms)
[ RUN      ] ExtractLvalueByStlStrTest.type_char16_t
[       OK ] ExtractLvalueByStlStrTest.type_char16_t (0ms)
[ RUN      ] ExtractLvalueByStlStrTest.type_char32_t
[       OK ] ExtractLvalueByStlStrTest.type_char32_t (0ms)
[----------] 4 tests from ExtractLvalueByStlStrTest(0ms total)

[----------] 4 tests from SplitLvalueBySingeCharTest
[ RUN      ] SplitLvalueBySingeCharTest.type_char
[       OK ] SplitLvalueBySingeCharTest.type_char (0ms)
[ RUN      ] SplitLvalueBySingeCharTest.type_wchar_t
[       OK ] SplitLvalueBySingeCharTest.type_wchar_t (0ms)
[ RUN      ] SplitLvalueBySingeCharTest.type_char16_t
[       OK ] SplitLvalueBySingeCharTest.type_char16_t (0ms)
[ RUN      ] SplitLvalueBySingeCharTest.type_char32_t
[       OK ] SplitLvalueBySingeCharTest.type_char32_t (0ms)
[----------] 4 tests from SplitLvalueBySingeCharTest(0ms total)

[----------] 4 tests from SplitLvalueByCStrTest
[ RUN      ] SplitLvalueByCStrTest.type_char
[       OK ] SplitLvalueByCStrTest.type_char (0ms)
[ RUN      ] SplitLvalueByCStrTest.type_wchar_t
[       OK ] SplitLvalueByCStrTest.type_wchar_t (0ms)
[ RUN      ] SplitLvalueByCStrTest.type_char16_t
[       OK ] SplitLvalueByCStrTest.type_char16_t (0ms)
[ RUN      ] SplitLvalueByCStrTest.type_char32_t
[       OK ] SplitLvalueByCStrTest.type_char32_t (0ms)
[----------] 4 tests from SplitLvalueByCStrTest(0ms total)

[----------] 4 tests from SplitLvalueByStlStrTest
[ RUN      ] SplitLvalueByStlStrTest.type_char
[       OK ] SplitLvalueByStlStrTest.type_char (1ms)
[ RUN      ] SplitLvalueByStlStrTest.type_wchar_t
[       OK ] SplitLvalueByStlStrTest.type_wchar_t (0ms)
[ RUN      ] SplitLvalueByStlStrTest.type_char16_t
[       OK ] SplitLvalueByStlStrTest.type_char16_t (0ms)
[ RUN      ] SplitLvalueByStlStrTest.type_char32_t
[       OK ] SplitLvalueByStlStrTest.type_char32_t (0ms)
[----------] 4 tests from SplitLvalueByStlStrTest(1ms total)

[----------] 2 tests from SplitLvalueCovertToIntBySingeCharTest
[ RUN      ] SplitLvalueCovertToIntBySingeCharTest.type_char
[       OK ] SplitLvalueCovertToIntBySingeCharTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntBySingeCharTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntBySingeCharTest.type_wchar_t (14ms)
[----------] 2 tests from SplitLvalueCovertToIntBySingeCharTest(14ms total)

[----------] 2 tests from SplitLvalueCovertToIntByCStrTest
[ RUN      ] SplitLvalueCovertToIntByCStrTest.type_char
[       OK ] SplitLvalueCovertToIntByCStrTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntByCStrTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntByCStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitLvalueCovertToIntByCStrTest(0ms total)

[----------] 2 tests from SplitLvalueCovertToIntByStlStrTest
[ RUN      ] SplitLvalueCovertToIntByStlStrTest.type_char
[       OK ] SplitLvalueCovertToIntByStlStrTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntByStlStrTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntByStlStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitLvalueCovertToIntByStlStrTest(0ms total)

[----------] 2 tests from SplitLvalueCovertToIntNoReturnBySingeCharTest
[ RUN      ] SplitLvalueCovertToIntNoReturnBySingeCharTest.type_char
[       OK ] SplitLvalueCovertToIntNoReturnBySingeCharTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntNoReturnBySingeCharTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntNoReturnBySingeCharTest.type_wchar_t (0ms)
[----------] 2 tests from SplitLvalueCovertToIntNoReturnBySingeCharTest(0ms total)

[----------] 2 tests from SplitLvalueCovertToIntNoReturnByCStrTest
[ RUN      ] SplitLvalueCovertToIntNoReturnByCStrTest.type_char
[       OK ] SplitLvalueCovertToIntNoReturnByCStrTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntNoReturnByCStrTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntNoReturnByCStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitLvalueCovertToIntNoReturnByCStrTest(0ms total)

[----------] 2 tests from SplitLvalueCovertToIntNoReturnByStlStrTest
[ RUN      ] SplitLvalueCovertToIntNoReturnByStlStrTest.type_char
[       OK ] SplitLvalueCovertToIntNoReturnByStlStrTest.type_char (0ms)
[ RUN      ] SplitLvalueCovertToIntNoReturnByStlStrTest.type_wchar_t
[       OK ] SplitLvalueCovertToIntNoReturnByStlStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitLvalueCovertToIntNoReturnByStlStrTest(0ms total)

[----------] 4 tests from ExtractRvalueBySingeCharTest
[ RUN      ] ExtractRvalueBySingeCharTest.type_char
[       OK ] ExtractRvalueBySingeCharTest.type_char (0ms)
[ RUN      ] ExtractRvalueBySingeCharTest.type_wchar_t
[       OK ] ExtractRvalueBySingeCharTest.type_wchar_t (0ms)
[ RUN      ] ExtractRvalueBySingeCharTest.type_char16_t
[       OK ] ExtractRvalueBySingeCharTest.type_char16_t (0ms)
[ RUN      ] ExtractRvalueBySingeCharTest.type_char32_t
[       OK ] ExtractRvalueBySingeCharTest.type_char32_t (0ms)
[----------] 4 tests from ExtractRvalueBySingeCharTest(0ms total)

[----------] 4 tests from ExtractRvalueByCStrTest
[ RUN      ] ExtractRvalueByCStrTest.type_char
[       OK ] ExtractRvalueByCStrTest.type_char (0ms)
[ RUN      ] ExtractRvalueByCStrTest.type_wchar_t
[       OK ] ExtractRvalueByCStrTest.type_wchar_t (0ms)
[ RUN      ] ExtractRvalueByCStrTest.type_char16_t
[       OK ] ExtractRvalueByCStrTest.type_char16_t (0ms)
[ RUN      ] ExtractRvalueByCStrTest.type_char32_t
[       OK ] ExtractRvalueByCStrTest.type_char32_t (0ms)
[----------] 4 tests from ExtractRvalueByCStrTest(1ms total)

[----------] 4 tests from ExtractRvalueByStlStrTest
[ RUN      ] ExtractRvalueByStlStrTest.type_char
[       OK ] ExtractRvalueByStlStrTest.type_char (0ms)
[ RUN      ] ExtractRvalueByStlStrTest.type_wchar_t
[       OK ] ExtractRvalueByStlStrTest.type_wchar_t (0ms)
[ RUN      ] ExtractRvalueByStlStrTest.type_char16_t
[       OK ] ExtractRvalueByStlStrTest.type_char16_t (0ms)
[ RUN      ] ExtractRvalueByStlStrTest.type_char32_t
[       OK ] ExtractRvalueByStlStrTest.type_char32_t (0ms)
[----------] 4 tests from ExtractRvalueByStlStrTest(0ms total)

[----------] 4 tests from SplitRvalueBySingeCharTest
[ RUN      ] SplitRvalueBySingeCharTest.type_char
[       OK ] SplitRvalueBySingeCharTest.type_char (0ms)
[ RUN      ] SplitRvalueBySingeCharTest.type_wchar_t
[       OK ] SplitRvalueBySingeCharTest.type_wchar_t (0ms)
[ RUN      ] SplitRvalueBySingeCharTest.type_char16_t
[       OK ] SplitRvalueBySingeCharTest.type_char16_t (0ms)
[ RUN      ] SplitRvalueBySingeCharTest.type_char32_t
[       OK ] SplitRvalueBySingeCharTest.type_char32_t (0ms)
[----------] 4 tests from SplitRvalueBySingeCharTest(0ms total)

[----------] 4 tests from SplitRvalueByCStrTest
[ RUN      ] SplitRvalueByCStrTest.type_char
[       OK ] SplitRvalueByCStrTest.type_char (0ms)
[ RUN      ] SplitRvalueByCStrTest.type_wchar_t
[       OK ] SplitRvalueByCStrTest.type_wchar_t (0ms)
[ RUN      ] SplitRvalueByCStrTest.type_char16_t
[       OK ] SplitRvalueByCStrTest.type_char16_t (0ms)
[ RUN      ] SplitRvalueByCStrTest.type_char32_t
[       OK ] SplitRvalueByCStrTest.type_char32_t (0ms)
[----------] 4 tests from SplitRvalueByCStrTest(0ms total)

[----------] 4 tests from SplitRvalueByStlStrTest
[ RUN      ] SplitRvalueByStlStrTest.type_char
[       OK ] SplitRvalueByStlStrTest.type_char (0ms)
[ RUN      ] SplitRvalueByStlStrTest.type_wchar_t
[       OK ] SplitRvalueByStlStrTest.type_wchar_t (0ms)
[ RUN      ] SplitRvalueByStlStrTest.type_char16_t
[       OK ] SplitRvalueByStlStrTest.type_char16_t (0ms)
[ RUN      ] SplitRvalueByStlStrTest.type_char32_t
[       OK ] SplitRvalueByStlStrTest.type_char32_t (0ms)
[----------] 4 tests from SplitRvalueByStlStrTest(1ms total)

[----------] 2 tests from SplitRvalueCovertToIntBySingeCharTest
[ RUN      ] SplitRvalueCovertToIntBySingeCharTest.type_char
[       OK ] SplitRvalueCovertToIntBySingeCharTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntBySingeCharTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntBySingeCharTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntBySingeCharTest(0ms total)

[----------] 2 tests from SplitRvalueCovertToIntByCStrTest
[ RUN      ] SplitRvalueCovertToIntByCStrTest.type_char
[       OK ] SplitRvalueCovertToIntByCStrTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntByCStrTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntByCStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntByCStrTest(0ms total)

[----------] 2 tests from SplitRvalueCovertToIntByStlStrTest
[ RUN      ] SplitRvalueCovertToIntByStlStrTest.type_char
[       OK ] SplitRvalueCovertToIntByStlStrTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntByStlStrTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntByStlStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntByStlStrTest(0ms total)

[----------] 2 tests from SplitRvalueCovertToIntNoReturnBySingeCharTest
[ RUN      ] SplitRvalueCovertToIntNoReturnBySingeCharTest.type_char
[       OK ] SplitRvalueCovertToIntNoReturnBySingeCharTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntNoReturnBySingeCharTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntNoReturnBySingeCharTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntNoReturnBySingeCharTest(0ms total)

[----------] 2 tests from SplitRvalueCovertToIntNoReturnByCStrTest
[ RUN      ] SplitRvalueCovertToIntNoReturnByCStrTest.type_char
[       OK ] SplitRvalueCovertToIntNoReturnByCStrTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntNoReturnByCStrTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntNoReturnByCStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntNoReturnByCStrTest(0ms total)

[----------] 2 tests from SplitRvalueCovertToIntNoReturnByStlStrTest
[ RUN      ] SplitRvalueCovertToIntNoReturnByStlStrTest.type_char
[       OK ] SplitRvalueCovertToIntNoReturnByStlStrTest.type_char (0ms)
[ RUN      ] SplitRvalueCovertToIntNoReturnByStlStrTest.type_wchar_t
[       OK ] SplitRvalueCovertToIntNoReturnByStlStrTest.type_wchar_t (0ms)
[----------] 2 tests from SplitRvalueCovertToIntNoReturnByStlStrTest(0ms total)

[----------] Global test environment tear-down.
[==========] 72 tests from 24 testcase ran. (159ms total)
[  PASSED  ] 72 tests.

いいね。

余談

どういうわけかどこの.bashrcも読み込んでくれないようなのので、root.x86_64/etc/bash.bashrc

source "${HOME}/.bashrc"

を追加するといいかもしれない。msys2で使っていたものがほぼそのまま使える。例えば

export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[m\]\[\e[36m\]\w\[\e[m\]\[\e[0m\]\n$'

とか書いて置くと見た目がきれいでいい。

スポンサーサイト

Google Apps Scriptで配列を返す関数を作る:居住市区町村の文字列正規化

未来研究室実行委員会の6月のイベントのアンケート解析で、住んでいる区市町村名を問う項目の集計を備え付けのifやらleftやらmid関数でやりくりするのは限界があったので、
Google Apps Script(通称GAS、ExcelVBAみたいな位置で言語的にはJavaScript)で関数を作りました。

ただ、データ数が2000件近くあるので全セルにこの作った関数を呼ぶ式を打つと

エラー: Script invoked too many times per second for this Google user accout.

といった具合に怒られるので対策が必要でした。

Google スプレッドシートでカスタム関数を多くのセルで呼び出しエラーが表示される場合、配列を返す関数(配列数式)に変更する。または、新しいスプレッドシートを利用。 | すぐに忘れる脳みそのためのメモ
を参考に配列を返す関数を作ります。

最も注意するべきなのは、自作関数の引数にある適当な範囲を渡した時の引数は、「stringのArrayのArray」ということです。断じて「stringのarray」ではありません。

function remove_prefectures_name(str){
	if(typeof str !== "string") return "error: unexpected input.";
	var buf = "";
	var tmp = str.charCodeAt(2);
	if("道".charCodeAt(0) === tmp || "都".charCodeAt(0) === tmp || "府".charCodeAt(0) === tmp || "県".charCodeAt(0) === tmp){
		buf = str.slice(3);
	}
	else if("県".charCodeAt(0) === str.charCodeAt(3)){
		buf = str.slice(4);
	}
	return (buf.length === 0) ? str : buf;
}
function match_in_array(arr, str){
	var is_matched = false;
	for(var i = 0; !is_matched && i < arr.length; ++i){
		is_matched = (arr[i] === str);
	}
	return is_matched;
}
function add_City(str){
	var case_do_not_add_City = ["市", "区", "町", "村", "県", "都", "道", "府", "県"];
	return (match_in_array(case_do_not_add_City, str.slice(-1))) ? str : str + "市";
}
function normalize_adress_helper(main_input, case1_input, case4_input){
	if(typeof main_input !== "string" || typeof case1_input !== "string" || typeof case4_input !== "string"){
		throw new TypeError("main_input(type:" + typeof main_input + ")unexpected input.");
	}
	var re = "";
	switch(main_input){
	case "1.東京23区内":
		re = (case1_input === "無記入" || case1_input === "") ? "無記入" : "1-" + case1_input + "区";
	break;
	case "4.その他":
		var do_not_edit = ["アメリカ", "韓国", "korea"];
		re = (case4_input === "無記入" || case4_input === "") ? "無記入" :  (match_in_array(do_not_edit, case4_input)) ? case4_input : add_City(remove_prefectures_name(case4_input));
	break;
	default:
		re = main_input;
	}
	return re;
}
function normalize_adress(main_input, case1_input, case4_input){
	if(typeof main_input === "string" && typeof case1_input === "string" && typeof case4_input === "string"){
		return normalize_adress_helper(main_input, case1_input, case4_input);
	}
	else if(Array.isArray(main_input) && Array.isArray(case1_input) && Array.isArray(case4_input) && main_input.length == case1_input.length && case1_input.length == case4_input.length){
		var re = [];
		for(var i = 0; i < main_input.length; ++i){
			re.push(normalize_adress_helper(main_input[i][0], case1_input[i][0], case4_input[i][0]));
		}
		return re;
	}
	else{
		throw new TypeError("main_input(type:" + typeof main_input + ")unexpected input.");
	}
}

テーマ : プログラミング
ジャンル : コンピュータ

Google Apps Scriptで範囲から欠けた数を列挙する

Google Apps Scriptで範囲から欠けた数を列挙する

今回もまたみらい研究室実行委員会の3/19に行ったイベントのアンケート解析をしています。

で、委員みんなでアンケートの内容を私が作ったGoogleFormに打ち込んでデータ化して、それを私がいい感じにまとめて「解析は任せた」の投げつけるお仕事をしているわけです
GoogleFormで打ち込むためにアンケートに通し番号を付けてそれを入力してもらうんですが、順番ばらばらでみんな打ち込むので、どれが欠けてるかわかりにくくて仕方ないです。
というわけで、欠けた数をカンマ区切りの文字列で返すlist_missing_num関数を作りました。

function list_missing_num(numbers) {
    if(
        "undefined" !== typeof(numbers) && Array.isArray(numbers)
        && "object" === typeof(numbers[0]) && Array.isArray(numbers[0]) && "number" === typeof(numbers[0][0])
    ){
        var arr = [];
        var i;
        for(i = 0; i < numbers.length; ++i) arr.push(numbers[i][0]);//convert
        arr.sort(function(a, b){ return a - b; });//sort
        arr = arr.filter(function (x, i, self) { return self.indexOf(x) === i; });//unique
        var re = [];
        var push_back = function(min, max){
            for(var i = min; i <= max; ++i) re.push(i);
        }
        var j;
        for(i = 1, j = arr[0]; i < arr.length; j = arr[i], ++i){
            if(1 !== arr[i] - j){
                push_back(j + 1, arr[i] - 1);//push missing nums
            }
        }
        return (re.length === 0) ? "nothing" : re.join();
    }
    else{
        throw new TypeError("unexpected input. numbers:" + typeof(numbers) + " min:" + typeof(min) + " max:" + typeof(max));
    }
}

まあ特に説明することは無いですね。重複はfilterで無視してます。

テーマ : プログラミング
ジャンル : コンピュータ

FirefoxのappVersionがおかしい

はじめに

きっかけは友人が
http://onigiri.hangame.co.jp/#
のサイトのゲームをFirefoxでも遊びたいと言ったことから始まった。

どうせUser-Agentが問題なんでしょ、と思い
ua-site-switch
User-Agent JS Fixer
を導入した。しかし遊べない。どうやってIEを判別しているのかと思い問題のサイトを調べてみた

問題のIE判別コード

どうやら問題の判別コードはhtmlに直書きしている模様。

function noIE(str){
	
			//IE判別
			if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("rv:11") != -1){
				goGameStart();
			}else{
				alert("ゲームスタートボタンは、Windows および Internet Explorer 8 以降でご利用いただけます。");
			}
		
}

やってることとしては、「navigator.appVersion」をString.prototype.indexOf()を使って"MSIE"が含まれているか(~IE10用)"rv:11"が含まれていれば(IE11)IEと認識する

特に問題なさそう。ということは「navigator.appVersion」に入っている値が問題なんだろう、と察しがつく。

navigator.appVersionとnavigator.userAgentを調べる

前項で「navigator.appVersion」が怪しいと分かったのでUA偽装なしで調べてみる。

IE 11.0.9600.17728
appVersion:"5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MAM3; MAMIJS)"
userAgent:"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MAM3; MAMIJS)"
Chrome 43.0.2357.124 m
appVersion:"5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
userAgent:"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
Firefox 38.0.5
appVersion:"5.0 (Windows)"
userAgent:"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"

待って、なんかFirefoxだけ明らかにおかしいんですけど。どうなってるんだってばよ!

結論

Firefoxのバグか仕様、だれかなんでこうなってるか教えて

テーマ : プログラミング
ジャンル : コンピュータ

そこはかとなくGooglespreadSheetの関数を作る:asc()





表題の通り。Microsoft Office ExcelやLibre Office Calcにはasc()関数があって、全角カタカナを半角カタカナに変換出来るんだけど、GoogleSpreadsheetにはそんな関数はない。
ならば作るしかないよね?
というわけで作ってみた。残念ながら記号とかを変換する機能は実装していない。
え?速度が遅い?私に一体何を期待してるんだい?

ちなみに似たような関数であるPHONETIC関数(ひらがな→全角カタカナ, 全角英数→半角英数)については
SpreadsheetsでExcelのPHONETIC的なことがしたい!
http://ryoichi0102.hatenablog.com/entry/2013/09/17/155804
を参考に。私がプログラミングするときも参考にしたしね。

使い方

  1. 適当にGoogle DriveからSpreadsheetsを作る
  2. 「ツール」→「スクリプトエディタ」で適当にプロジェクトを作製
  3. コピペ
  4. 使うセルで「=asc(D2)」みたいにすればいいんじゃない?

code

適当なhighlighterがなかったのでideaone.comを利用した。そういやこれ、Google Apps Script(GAS)って言うらしいね。

引数
置換対象文字列(string)
戻り値
置換された文字列
機能
引数中の全角カタカナを半角カタカナに置換します、記号の半角化は実装されていません

Licence

The MIT License (MIT)

Copyright (c) 2015 yumetodo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

編集後記

私はJavaScriptを殆ど書いたことがないから、どうやって高速化したらいいのか検討もつかない。なんとなくfor文は避けたほうがいいんじゃないか?くらいしか思い浮かばなかった。同じ文字列に対してreplaceを複数回呼ぶのと、replaseのinline関数でif文で処理分けるのとどっちが早いんだろ。・・・まあいいや、動いたし。C99/C++14erにはわからない話。

検索フォーム
デジタル・コルクマ3
コルクマワールド
東京 での時間:
更新履歴


総記事数:
Calendar 1.1
<
>
- - - - - - 1
2 3 4 5 6 78
9 10 11 12 13 1415
16 17 18 19 20 2122
23 24 25 26 27 2829
30 31 - - - - -

全記事

Designed by 石津 花

最新記事
カテゴリ
最新コメント
最新トラックバック
月別アーカイブ
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

yumetodo

Author:yumetodo
FC2ブログへようこそ!

Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。