今から10年以上前のまだ学生だった頃,当時はBIOSが主流だったのでUbuntuをインストールしたUSBメモリを常にカバンに入れておき,何かあればそれをブートしてPCのメンテをやったりしていた.(起動しなくなったPCからデータをサルベージしてほしい.という友人からのヘルプ要請に応じるのが主な用途だった.笑)
それがUEFIが主流になって以降,作り方がわからず半ば諦めていたが,最近はノートPCに挿しっぱなしできるようなドングルタイプで128GBを超えるようなUSBメモリが安価で手に入ることを知り,ポータブルLinuxを手に入れたい衝動が再燃し,本腰を入れて取り組んでみた.
2025年3月21日金曜日
2024年5月3日金曜日
2021年10月24日日曜日
Linux サーバーでOpenVPN を構築する
Debianで作成した自作ルーターにOpenVPN を立てたので手順を残す.
今回参考にさせて頂いたのは以下のページ.非常にわかり易い.投稿者様に感謝.
OpenVPNのインストールとセットアップからインターネット接続までのガイドブック - Qiita
手順としては大きく分けて3段階あり,はじめにEasy-RSAで証明書を生成し,次にサーバー用の設定ファイルを作成してOpenVPN を起動する.最後にクライアント用の設定ファイルを作成して,クライアントからVPN 接続できれば完了だ.
まずは,実行環境の確認.Debian 系なら大差ないと思うが,適宜環境に合わせて欲しい.
以降,具体的な手順に移る.
今回参考にさせて頂いたのは以下のページ.非常にわかり易い.投稿者様に感謝.
OpenVPNのインストールとセットアップからインターネット接続までのガイドブック - Qiita
手順としては大きく分けて3段階あり,はじめにEasy-RSAで証明書を生成し,次にサーバー用の設定ファイルを作成してOpenVPN を起動する.最後にクライアント用の設定ファイルを作成して,クライアントからVPN 接続できれば完了だ.
まずは,実行環境の確認.Debian 系なら大差ないと思うが,適宜環境に合わせて欲しい.
$ cat /etc/debian_version 11.1 $ uname -srvmo Linux 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux
以降,具体的な手順に移る.
2021年2月4日木曜日
マルチスレッドなプログラムをgdbでデバッグする
たまにはエンジニアらしくソフトウェアのお話を.
マルチスレッドなプログラムを書くとき, 常に念頭に置きながら設計しなければならないのが排他制御だが,そんなとき,どの処理がどのスレッドで実施されているか表示できることは非常に有効なテクニックだ.
そこで次のようなコードで実験する.
<サンプルコード:test.cpp>
これをコンパイルして,gdbで実行する
マルチスレッドなプログラムを書くとき, 常に念頭に置きながら設計しなければならないのが排他制御だが,そんなとき,どの処理がどのスレッドで実施されているか表示できることは非常に有効なテクニックだ.
そこで次のようなコードで実験する.
<サンプルコード:test.cpp>
test.cpp
--------------------------------------------------------------------------------
#include <iostream>
#include <thread>
#include <unistd.h>
void a( void )
{
for( int i = 0; i < 30; i++ )
{
std::cout << "i : " << i << std::endl;
sleep( 1 );
}
}
void b( void )
{
for( int j = 0; j < 10; j++ )
{
std::cout << "j : " << j << std::endl;
sleep( 3 );
}
}
int main( void )
{
std::thread * _a = new std::thread( a );
std::thread * _b = new std::thread( b );
_a->join();
_b->join();
return 0;
}
※本来は,coutする前後でmutexを貼る必要があるが,今回は可読性重視で割愛する.
これをコンパイルして,gdbで実行する
$ g++ -g -pthread test.cpp -o test $ gdb ./test
2014年10月18日土曜日
Windows でパッケージ管理ができる Chocolatey が素晴らしい.
私が Windows が嫌いな理由の一つはセットアップが非常に面倒くさいことだ.
Linux なら OS を再インストールしても,予め用意したシェルをポーンと一発動かせば設定が完了するのに,Windowsでは,ググる→ダウンロードする→インストールするの作業を何度も何度も繰り返さなければいけない.
と思っていたが,つい先程 Windows にもパッケージ管理ができるソフトがあることを知った.
いやー,無知は最大の罪であるとはよく言ったものだ.
こんなことも知らないで,Windows は糞だ!と言っていたらパソコン先生に怒られてしまいます.
というわけで,パッケージ管理ソフト Chocholatey です.
インストール方法からしてからコマンドという徹底ぶり.
公式ホームページにアクセスすれば書いてありますが,コマンドプロンプトを開いて,以下のコマンドを実行すれば完了です.
インストールが完了したら,いつも使っているソフトのインストール.(Firefox とか Dropbox とか itunes とか)
その他のコマンドを以下に示します.
パッケージリストのアップデート
特定のパッケージのアップデート
インストールした全てのパッケージのアップデート
以下に,私がインストールしたもの一覧を記しておきます.
Linux なら OS を再インストールしても,予め用意したシェルをポーンと一発動かせば設定が完了するのに,Windowsでは,ググる→ダウンロードする→インストールするの作業を何度も何度も繰り返さなければいけない.
と思っていたが,つい先程 Windows にもパッケージ管理ができるソフトがあることを知った.
いやー,無知は最大の罪であるとはよく言ったものだ.
こんなことも知らないで,Windows は糞だ!と言っていたらパソコン先生に怒られてしまいます.
というわけで,パッケージ管理ソフト Chocholatey です.
インストール方法からしてからコマンドという徹底ぶり.
公式ホームページにアクセスすれば書いてありますが,コマンドプロンプトを開いて,以下のコマンドを実行すれば完了です.
| @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin |
インストールが完了したら,いつも使っているソフトのインストール.(Firefox とか Dropbox とか itunes とか)
| > choco install Firefox dropbox itunes |
その他のコマンドを以下に示します.
パッケージリストのアップデート
| > choco update |
特定のパッケージのアップデート
| > choco update パッケージ名 |
インストールした全てのパッケージのアップデート
| > choco update all |
以下に,私がインストールしたもの一覧を記しておきます.
- Dropbox
- Firefox
- Skype
- OneDrive
- iTunes
- Cygwin
- cyg-get
- virtualclonedrive
- vlc
- AdobeReader
- CCleaner
- XnView
- PowerShell
- JavaRuntime
- MicrosoftSecurityEssentials
- FlashPlayerPlugin
- FlashPlayerActiveX
- GoogleJapaneseInput
2014年9月23日火曜日
【Linux】HDDにパーティションを作成する.(GPT編)
以前,【Linux】HDDにパーティションを作成する.(MBR編)という記事を書いたが,今回はその続き.というか番外編.
つい5日ほど前,Raspberry Pi で NFS サーバーを実装した.そのときはたまたま余っていたポータブル HDD を使用したため,電力供給源は当然 USB バスパワー.そのせいかは分からないが Raspberry Pi が頻繁に落ちるようになった...サーバーなのに安定性ゼロ!
そこで,どうせなら大容量の据置型外付けHDDを買うかってことで,アイ・オー・データの3.0TBの外付けHDDを購入した.


I-O DATA USB 3.0/2.0接続【家電対応】外付ハードディスク 3.0TB HDC-LA3.0
それが本日届いたため,早速 fdisk コマンドと mkfs コマンドでサクッとフォーマットを試みた.しかし,以下のようなエラーメッセージが表示され,敢え無く失敗.
警告: GPT (GUID パーティションテーブル) が '/dev/sdc' に検出されました! この fdisk ユーティリティは GPT をサポートしません。GNU Parted を使ってください。
GPT・・・!?
なんぞそれ.
そこで調べてみると,
GPT は MBR(マスターブートレコード)に代わるもので,MBR では 2.0TB を超える大容量のディスクを扱うことができないため,新しく設けられたパーティション管理の方法だとか.FAT32 では 4GB を超えるファイルが扱えないとかと同じような制約ってことですかね.多分.
MBR と言えば,grub rescue とか色々と飛び火しそうな話題ですが,今回は割愛.とにかく fdisk コマンドでは GPT をサポートしてないので代替手段が必要だが,答えはすでに上に書かれていて,GNU Parted もとい parted コマンドでフォーマット及びパーティション作成を行なう.
まずは,parted コマンドで該当するディスクを指定する.
その後は help コマンドを使用すれば,各コマンドの使い方がわかる.
今回は mklebal コマンドで,新しいgptパーティションテーブルを作成し,
mkpart コマンドで,パーティションを切る.
パーテションの名前とファイルシステムの種類は指定せずにデフォルトのままで構わない.
【追記】
この記事をひと通り作成してから,fdisk コマンドによく似た gdisk コマンドがあることがわかった.gdisk コマンドでは gpt をサポートしているので,fdisk に慣れている人は gdisk コマンド + mkfs コマンドの合わせ技でも良いようだ.
つい5日ほど前,Raspberry Pi で NFS サーバーを実装した.そのときはたまたま余っていたポータブル HDD を使用したため,電力供給源は当然 USB バスパワー.そのせいかは分からないが Raspberry Pi が頻繁に落ちるようになった...サーバーなのに安定性ゼロ!
そこで,どうせなら大容量の据置型外付けHDDを買うかってことで,アイ・オー・データの3.0TBの外付けHDDを購入した.
I-O DATA USB 3.0/2.0接続【家電対応】外付ハードディスク 3.0TB HDC-LA3.0
それが本日届いたため,早速 fdisk コマンドと mkfs コマンドでサクッとフォーマットを試みた.しかし,以下のようなエラーメッセージが表示され,敢え無く失敗.
警告: GPT (GUID パーティションテーブル) が '/dev/sdc' に検出されました! この fdisk ユーティリティは GPT をサポートしません。GNU Parted を使ってください。
GPT・・・!?
なんぞそれ.
そこで調べてみると,
GPT は MBR(マスターブートレコード)に代わるもので,MBR では 2.0TB を超える大容量のディスクを扱うことができないため,新しく設けられたパーティション管理の方法だとか.FAT32 では 4GB を超えるファイルが扱えないとかと同じような制約ってことですかね.多分.
MBR と言えば,grub rescue とか色々と飛び火しそうな話題ですが,今回は割愛.とにかく fdisk コマンドでは GPT をサポートしてないので代替手段が必要だが,答えはすでに上に書かれていて,GNU Parted もとい parted コマンドでフォーマット及びパーティション作成を行なう.
まずは,parted コマンドで該当するディスクを指定する.
| $ sudo parted /dev/sdc |
その後は help コマンドを使用すれば,各コマンドの使い方がわかる.
今回は mklebal コマンドで,新しいgptパーティションテーブルを作成し,
(parted) mklabel 新しいディスクラベル? gpt 警告: いま存在している /dev/sdc のディスクラベルは破壊され、このディスクの全デー タが失われます。続行しますか? はい(Y)/Yes/いいえ(N)/No? yes |
mkpart コマンドで,パーティションを切る.
(parted) mkpart パーティションの名前? []? ファイルシステムの種類? [ext2]? 開始? 0% 終了? 100% |
パーテションの名前とファイルシステムの種類は指定せずにデフォルトのままで構わない.
【追記】
この記事をひと通り作成してから,fdisk コマンドによく似た gdisk コマンドがあることがわかった.gdisk コマンドでは gpt をサポートしているので,fdisk に慣れている人は gdisk コマンド + mkfs コマンドの合わせ技でも良いようだ.
2014年8月24日日曜日
【Linux】HDDにパーティションを作成する.(MBR編)
コマンドを用いて,HDDやUSBメモリにパーティションを作成する方法を示す.
今回は例として,/dev/sdc に基本パーティションを一つ作成し,それを ext4 でフォーマットする.
まず fdisk コマンドで /dev/sdc を指定する.
mでヘルプを表示できるので,それに従い必要な操作を行う
今回の設定では,o コマンド,n コマンド(設定は全てデフォルト),w コマンドを順に実行する.
終了したら,念の為うまく設定できているか確認する.
(実行結果例)
最後に,作成したパーティション /dev/sdc1 を ext4 でフォーマットする.
今回は例として,/dev/sdc に基本パーティションを一つ作成し,それを ext4 でフォーマットする.
まず fdisk コマンドで /dev/sdc を指定する.
| $ sudo fdisk /dev/sdc |
mでヘルプを表示できるので,それに従い必要な操作を行う
コマンドの動作 a ブート可能フラグをつける b bsd ディスクラベルを編集する c dos 互換フラグをつける d パーティションを削除する l 既知のパーティションタイプをリスト表示する m このメニューを表示する n 新たにパーティションを作成する o 新たに空の DOS パーティションテーブルを作成する p パーティションテーブルを表示する q 変更を保存せずに終了する s 空の Sun ディスクラベルを作成する t パーティションのシステム ID を変更する u 表示/項目ユニットを変更する v パーティションテーブルを照合する w テーブルをディスクに書き込み、終了する x 特別な機能 (エキスパート専用) |
今回の設定では,o コマンド,n コマンド(設定は全てデフォルト),w コマンドを順に実行する.
終了したら,念の為うまく設定できているか確認する.
| $ sudo fdisk -l /dev/sdc |
(実行結果例)
Disk /dev/sdc: 64.2 GB, 64156073984 bytes ヘッド 14, セクタ 3, シリンダ 2983448, 合計 125304832 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0xf52b7069 デバイス ブート 始点 終点 ブロック Id システム /dev/sdc1 2048 125304831 62651392 83 Linux |
最後に,作成したパーティション /dev/sdc1 を ext4 でフォーマットする.
| $ sudo mkfs -t ext4 /dev/sdc1 |
2014年7月21日月曜日
【Linux】文字コードや改行コードを変換して上書きする.【nkf】
文字コードや改行コードを変換するときは nkf コマンドを使用する.
主なオプションは以下の通り.
【文字コード】
【改行コード】
【その他】
(例)文字コードを Shift_JIS に変換する
(例)改行コードを CF に変換する
(例)文字コードを自動判別する
(例)文字コードを UTF-8 に,改行コードを LF に変換し元のファイルを上書きする.
(誤)--overwriteを使わずに,入出力に同じファイル名を指定すると,空ファイルになるので注意.
| $ nkf オプション input.txt > output.txt |
主なオプションは以下の通り.
【文字コード】
-e :EUC-JPコードに変換する. -j :ISO-2022-JPコードに変換する. -s :Shift_JISコードに変換する. -w :UTF-8コードに変換する.
【改行コード】
-Lm :CRに変換する. (Mac OSの標準) -Lu :LFに変換する. (UNIX系のOSの標準) -Lw :LF+CRに変換する.(Windowsの標準)
【その他】
-g :現在の文字コードを判別する. --overwite:上書きする.
(例)文字コードを Shift_JIS に変換する
| $ nkf -s hoge.txt > fuga.txt |
(例)改行コードを CF に変換する
| $ nkf -Lm hoge.txt > fuga.txt |
(例)文字コードを自動判別する
| $ nkf -g hoge.txt |
(例)文字コードを UTF-8 に,改行コードを LF に変換し元のファイルを上書きする.
| $ nkf -w -Lu --overwrite hoge.txt |
(誤)--overwriteを使わずに,入出力に同じファイル名を指定すると,空ファイルになるので注意.
| $ nkf -w -Lu hoge.txt > hoge.txt |
2014年7月20日日曜日
【Linux】重複したファイルを探して削除する.
iTunesのライブラリを整理していたら,操作を誤ってしまい大量の重複ファイルができてしまった.
(参考画像)
いつもだったら,find と grep の合わせ技で削除していくところだが,今回はファイル数が膨大なので,万が一ミスして必要なファイルまで削除してしまったら大変なことになる.
そこで,今回は fdupes という重複ファイルを見つけ出すプログラムを利用した.
使い方は非常に簡単で,以下のように打つと,次から次へとチェックし,
終了すると重複ファイルリストを一気に出力する.なお,r は再帰的に検索するオプション.
出来上がったリストをひと通りチェックし問題がなさそうだったら,次はいよいよ削除する.
出力の加工にはおなじみの sort コマンドや,uniq コマンド,grep コマンドなど適宜使用する.
ここではまず ***1.mp3 というファイル名のものを抽出するために grep コマンドを使用し,
さらに「スペース」を「バックスラッシュ2個+スペース」に変換するために sed コマンドを使用した.
fdueps は find などに比べればとても低速だが,ファイルサイズや,md5ハッシュ値を用いて
重複ファイルを抽出するので,間違いが起きる心配がなく,非常に有用なプログラムと言えそうだ.
作者様に感謝である.
(参考画像)
いつもだったら,find と grep の合わせ技で削除していくところだが,今回はファイル数が膨大なので,万が一ミスして必要なファイルまで削除してしまったら大変なことになる.
そこで,今回は fdupes という重複ファイルを見つけ出すプログラムを利用した.
使い方は非常に簡単で,以下のように打つと,次から次へとチェックし,
$ fdupes -r ~/Music |
終了すると重複ファイルリストを一気に出力する.なお,r は再帰的に検索するオプション.
出来上がったリストをひと通りチェックし問題がなさそうだったら,次はいよいよ削除する.
$ fdupes -r ~/Music | grep 1.mp3$ | sed s/" "/"\\\\\\\\ "/g | xargs rm |
出力の加工にはおなじみの sort コマンドや,uniq コマンド,grep コマンドなど適宜使用する.
ここではまず ***1.mp3 というファイル名のものを抽出するために grep コマンドを使用し,
さらに「スペース」を「バックスラッシュ2個+スペース」に変換するために sed コマンドを使用した.
fdueps は find などに比べればとても低速だが,ファイルサイズや,md5ハッシュ値を用いて
重複ファイルを抽出するので,間違いが起きる心配がなく,非常に有用なプログラムと言えそうだ.
作者様に感謝である.
2014年7月6日日曜日
Raspberry Pi で LDAP サーバーを構築する.
Raspberry Pi で LDAP サーバーを組んだので手順を記す.
下記エントリーにおいて 14. まで終了した状態から始める.
WM×LI: Raspberry Pi の初期設定(備忘録)
1. ssh でログイン
2. slapd 及び ldap-utils をインストールする.
途中,管理者用のパスワードを尋ねられるので,あらかじめ考えておく.
3. slapcat コマンドで現在の状態を確認する.
4. 以下の内容で,taro.ldif という名前のファイルを作成する.
5. taro ユーザを追加する.
8. 作成したユーザを利用するため,libnss-ldapd をインストール
途中, LDAPサーバーのURIを聞かれるので,
とする.さらに LDAPルックアップ の選択画面になるので,全てチェックする.
9. 以下の一行を /etc/pam.d/common-session に追加する.
これにより,ログイン時にホームディレクトリが存在しなければ,自動的に作成されるようになる.
10. su コマンドで taro ユーザになる.
無事にログイン,ホームディレクトリの作成が完了すれば設定は全て終了.
taro ユーザを使えるクライアントを増やしたいときは,クライアント上で 8. 以降を実行する.
その際,URI は localhost ではなく,LDAPサーバーのIPアドレス(192.168.100.2)を指定する.
なお,ここに示したのは必要最低限の設定.
実際に組織レベルでLDAPを構成するには,以下の記事を参考されたし.
Raspberry Pi で LDAP サーバーを組む.その2
下記エントリーにおいて 14. まで終了した状態から始める.
WM×LI: Raspberry Pi の初期設定(備忘録)
1. ssh でログイン
| @client $ ssh pi@192.168.100.2 |
2. slapd 及び ldap-utils をインストールする.
pi@hoge ~ $ sudo apt-get install -y slapd ldap-utils |
3. slapcat コマンドで現在の状態を確認する.
| pi@hoge ~ $ sudo slapcat |
4. 以下の内容で,taro.ldif という名前のファイルを作成する.
dn: uid=taro,dc=co,dc=jp objectClass: inetOrgPerson objectClass: posixAccount sn: Yamada cn: Taro Yamada uid: taro uidNumber: 1001 gidNumber: 1001 loginShell: /bin/bash homeDirectory: /home/taro |
5. taro ユーザを追加する.
| pi@hoge ~ $ ldapadd -x -W -D cn=admin,dc=co,dc=jp -f taro.ldif |
x : SASL認証の代わりに簡易認証を使用する. W : 対話形式でLDAPのパスワードを認証する. D : LDAPの識別名(DN)を指定する. f : ファイルを指定.6. taro ユーザにパスワードを設定する.
pi@hoge ~ $ ldappasswd -x -W -S -D cn=admin,dc=co,dc=jp uid=taro,dc=co,dc=jp |
S : 対話形式でパスワードを設定する.7. 再び slapcat コマンドを実行し,taro ユーザが追加されたことを確認する.
| pi@hoge ~ $ sudo slapcat |
8. 作成したユーザを利用するため,libnss-ldapd をインストール
| pi@hoge ~ $ sudo apt-get install -y libnss-ldapd |
途中, LDAPサーバーのURIを聞かれるので,
| ldap://localhost/ |
9. 以下の一行を /etc/pam.d/common-session に追加する.
| session required pam_mkhomedir.so umask=0022 skel=/etc/skel |
10. su コマンドで taro ユーザになる.
| pi@hoge ~ $ su taro |
無事にログイン,ホームディレクトリの作成が完了すれば設定は全て終了.
taro ユーザを使えるクライアントを増やしたいときは,クライアント上で 8. 以降を実行する.
その際,URI は localhost ではなく,LDAPサーバーのIPアドレス(192.168.100.2)を指定する.
なお,ここに示したのは必要最低限の設定.
実際に組織レベルでLDAPを構成するには,以下の記事を参考されたし.
Raspberry Pi で LDAP サーバーを組む.その2
2014年6月29日日曜日
【Linux】exiftool で写真の向きを変更する.
以前,コマンドラインからEXIF情報を編集するためのツールとして,exiftoolを紹介しました.
その際は,日付の修正に利用しましたが,今回は画像の回転を行ってみたいと思います.
(具体例)
私の愛器 E-PM1 は残念なことに加速度センサーが付いていないため
どんな向きで写真を撮っても必ず横長の写真になります.
しかし,場合によってはカメラを縦に持って写真を撮ったりすることもあるため
写真の向きを編集し直す必要があります.
そこで,EXIF情報を閲覧・変更できる exiftool コマンドを使います.
まずは 画像の向きを確認する方法です.
標準出力
このように現在の画像の向きが表示されます.
いま,向きの変更を行っていないので,Horizontal(normal)になっています.
また n オプション を追加すると,文字列ではなく,数字で表示させることができます.
標準出力
では,変更するときはどうするかと言えば,
とします.6 は 90度時計回りに回転させることに対応しています.
(上の具体例はまさにこれです)
重要なことは,この回転の向きは相対値ではなく絶対値だということです.
どういうことかと言えば,このコマンドを何度実行しても得られる結果は同じということです.
つまり,hoge.jpgは現在の向きから90度回転するのではなく,オリジナルに対して90度回転します.
以下に,回転の向きと数字の対応を示します.
1・・・回転なし(オリジナル)
2・・・左右反転
3・・・180度回転
4・・・上下反転
5・・・左右反転+270度回転
6・・・90度回転
7・・・左右反転+90度回転
8・・・270度回転
なんだかややこしいですが,
回転のみのものは向きを変えても字が読めるもの.反転を読めなくなるもの.
とでも説明すれば良いでしょうか・・・.
通常は,1,3,6,8のみを使えば良さそうですね.
その際は,日付の修正に利用しましたが,今回は画像の回転を行ってみたいと思います.
(具体例)
![]() | ![]() |
| 修正前 | 修正後 |
私の愛器 E-PM1 は残念なことに加速度センサーが付いていないため
どんな向きで写真を撮っても必ず横長の写真になります.
しかし,場合によってはカメラを縦に持って写真を撮ったりすることもあるため
写真の向きを編集し直す必要があります.
そこで,EXIF情報を閲覧・変更できる exiftool コマンドを使います.
まずは 画像の向きを確認する方法です.
$ exiftool -Orientation hoge.jpg |
Orientation : Horizontal (normal) |
このように現在の画像の向きが表示されます.
いま,向きの変更を行っていないので,Horizontal(normal)になっています.
また n オプション を追加すると,文字列ではなく,数字で表示させることができます.
| $ exiftool -Orientation -n hoge.jpg |
Orientation : 1 |
では,変更するときはどうするかと言えば,
| $ exiftool -Orientation=6 -n hoge.jpg |
とします.6 は 90度時計回りに回転させることに対応しています.
(上の具体例はまさにこれです)
重要なことは,この回転の向きは相対値ではなく絶対値だということです.
どういうことかと言えば,このコマンドを何度実行しても得られる結果は同じということです.
つまり,hoge.jpgは現在の向きから90度回転するのではなく,オリジナルに対して90度回転します.
以下に,回転の向きと数字の対応を示します.
1・・・回転なし(オリジナル)
2・・・左右反転
3・・・180度回転
4・・・上下反転
5・・・左右反転+270度回転
6・・・90度回転
7・・・左右反転+90度回転
8・・・270度回転
なんだかややこしいですが,
回転のみのものは向きを変えても字が読めるもの.反転を読めなくなるもの.
とでも説明すれば良いでしょうか・・・.
通常は,1,3,6,8のみを使えば良さそうですね.
2014年5月16日金曜日
Mathematica の ClearAll は Clear Global だった.
研究で Mathematica と MATLAB を主に使用しているが,
両者の Clear All (自分の定義した変数をクリアする)には違いがあることを今更知った.
MATLABでは
Mathematicaでは
とする.今まで,Mathematica で
と打って満足していたが,ClearAll は引数をとって,
その引数に関する値や属性などの情報をすべてクリアするという関数だったらしい・・・.
Mathematica は関数の補完機能が充実しているので,Cl と打っただけで
候補の中に ClearAll が現れる.
特に考えずにそれを実行していたことが今回の要因だ.
GUIは非常に便利だが,慣れすぎると危険だと言うことを改めて感じる.
両者の Clear All (自分の定義した変数をクリアする)には違いがあることを今更知った.
MATLABでは
>> clear all |
Mathematicaでは
In[1]:= Clear["Global`*"] |
とする.今まで,Mathematica で
In[1]:= ClearAll |
と打って満足していたが,ClearAll は引数をとって,
その引数に関する値や属性などの情報をすべてクリアするという関数だったらしい・・・.
Mathematica は関数の補完機能が充実しているので,Cl と打っただけで
候補の中に ClearAll が現れる.
特に考えずにそれを実行していたことが今回の要因だ.
GUIは非常に便利だが,慣れすぎると危険だと言うことを改めて感じる.
2014年4月23日水曜日
vimの「記録」の使い方
自称vim使いのくせに今まで「記録」を使いこなせていなかったので意識的に使うようにし始めた.
手順としてはコマンドモードで
を入力し,「記録」モードに入る.(下に「記録中」と表示される.)
その状態から繰り返したい作業を行なっていく.
例えば
を入力し,行末まで移動して,そこから
を5回入力して,左に5文字戻る.その位置で
を入力して「挿入」モードに入り,適当に文字(hoge)を入力したら,
でコマンドモードに戻る.最後に「記録」モードを終了するために
を入力する.
コマンドモードに戻ったら作業を繰り返したい行に移動して
を入力すると,「行末から左に5文字戻った場所にhogeと入力する」という作業が繰り返される.
単純な作業の繰り返し(行末にhogeと入力する:Aコマンド+hoge+Esc)等ならば,
.(ドット)コマンドで繰り返せば良いが,複数のコマンドを組み合わせた
煩雑な作業を繰り返す場合には「記録」モードを上手く使うと効率が格段に上がる.
例えば,複数のファイルを同時に開いて,一つ目のファイルで作業を記録し
二つ目以降のファイルについては繰り返しコマンドで一瞬で作業を終了させる
なんて使い方ができれば非常に気持ちが良いし,後ろで画面を眺めている人がいれば
まるで魔法みたいで格好良い.
手順としてはコマンドモードで
| qa |
を入力し,「記録」モードに入る.(下に「記録中」と表示される.)
その状態から繰り返したい作業を行なっていく.
例えば
| $ |
を入力し,行末まで移動して,そこから
| h |
を5回入力して,左に5文字戻る.その位置で
| i |
を入力して「挿入」モードに入り,適当に文字(hoge)を入力したら,
| Esc |
でコマンドモードに戻る.最後に「記録」モードを終了するために
| q |
を入力する.
コマンドモードに戻ったら作業を繰り返したい行に移動して
| @a |
を入力すると,「行末から左に5文字戻った場所にhogeと入力する」という作業が繰り返される.
単純な作業の繰り返し(行末にhogeと入力する:Aコマンド+hoge+Esc)等ならば,
.(ドット)コマンドで繰り返せば良いが,複数のコマンドを組み合わせた
煩雑な作業を繰り返す場合には「記録」モードを上手く使うと効率が格段に上がる.
例えば,複数のファイルを同時に開いて,一つ目のファイルで作業を記録し
二つ目以降のファイルについては繰り返しコマンドで一瞬で作業を終了させる
なんて使い方ができれば非常に気持ちが良いし,後ろで画面を眺めている人がいれば
まるで魔法みたいで格好良い.
2014年3月1日土曜日
YouTubeで動画をリピート再生させる方法
YouTubeで音楽を聴くようなことはあまりないのですが,
先日公開されたZ会のCMが気に入ったので作業用BGMにしています.
やり方は非常に簡単で,URLを少し弄るだけ.
youtube.com → youtuberepeat.com
【変更前】
【変更後】
URLを変更してEnterを押せばリピート用の別ページに飛ばされ,即リピート再生が開始される.
それにしても,新海誠監督に佐倉綾音とやなぎなぎとか俺得なCMです.
先日公開されたZ会のCMが気に入ったので作業用BGMにしています.
やり方は非常に簡単で,URLを少し弄るだけ.
youtube.com → youtuberepeat.com
【変更前】
【変更後】
URLを変更してEnterを押せばリピート用の別ページに飛ばされ,即リピート再生が開始される.
それにしても,新海誠監督に佐倉綾音とやなぎなぎとか俺得なCMです.
2013年11月19日火曜日
特定の文字列を含まないファイルを検索する.
LaTeXのソースファイルで特定のパッケージ(hogeとする)を含んでいないファイルをリストアップさせようと思ったが,
としてもうまく検索できなかった(余計なファイルが複数リストアップされた).理由がわからず,しばらく考え込んでいたが,そもそも grep は行検索を行うので,これでは
*.tex というファイル名で,usepackageという文字列を含む行を含み,hogeという文字列を含まない行を含むファイル(何を言ってるのか分かりにくい)
を,要するにhogeが含まれない行があるファイルを,検索していたので,例えば空行が一つでもあればヒットするような検索になっていた.
こんなときはどうするのかと思って調べるとちゃんとオプションが用意されており,Lオプションで検索できるらしい.
これにて一見落着.100個ぐらいリストアップされてたファイルを20個くらいに減らせた.さらにパッケージの追加も sed を使って行ったのでエディタを全く使わずにファイルを編集できた.(すばらっ)
こう考えると,オプションとして -lv を指定するっ機会ってほとんど無いような・・・(いや,そんなこともないか)
| $ find . -name "*.tex" | xargs grep -l "usepackage" | xargs grep -lv "hoge" | |
としてもうまく検索できなかった(余計なファイルが複数リストアップされた).理由がわからず,しばらく考え込んでいたが,そもそも grep は行検索を行うので,これでは
*.tex というファイル名で,usepackageという文字列を含む行を含み,hogeという文字列を含まない行を含むファイル(何を言ってるのか分かりにくい)
を,要するにhogeが含まれない行があるファイルを,検索していたので,例えば空行が一つでもあればヒットするような検索になっていた.
こんなときはどうするのかと思って調べるとちゃんとオプションが用意されており,Lオプションで検索できるらしい.
| $ find . -name "*.tex" | xargs grep -l "usepackage" | xargs grep -L "hoge" |
これにて一見落着.100個ぐらいリストアップされてたファイルを20個くらいに減らせた.さらにパッケージの追加も sed を使って行ったのでエディタを全く使わずにファイルを編集できた.(すばらっ)
こう考えると,オプションとして -lv を指定するっ機会ってほとんど無いような・・・(いや,そんなこともないか)
2013年10月26日土曜日
【Excel】フリガナを一括削除する
ソート(並び替え)を行ったにも関わらず,順番が微妙に揃わない.
具体的には漢字で始まるワードが二種類の場所に別れる.
(例)「鉛筆」という項目が二箇所に分かれていて完全にはソートできていない.
なぜこんなことが起きるのか調べてみると,理由はフリガナにあるらしい.
フリガナが設定されているセルではソート時にフリガナを考慮してソートするので,フリガナが設定されているセルと,設定されていないセルが混在しているとソート時に二箇に別れるようだ.
(尚,フリガナを表示するにはセルを右クリックして「ふりがなの表示」をチェックする)
つまり,解決するには全てのセルにフリガナを設定するか,全てのセルからフリガナを削除するか.の二択になる.前者はデータ量的にに不可能なので,今回は削除するほうを考える.
しかし,フリガナを削除するというコマンドは存在しない.
そこで,コピペをうまく利用する.
まずは,フリガナを削除したいシートをコピーする.
そしてコピーされたシートのセルを全て選択し,コピー元のシートに貼り付ける.
その際,形式を選択して貼り付けで数式を選ぶ.
最後にコピーしたシートを削除する.
数式を選択して貼り付けると,フリガナ情報がコピーされないので,結局全てのセルからフリガナを削除することができる.
これにて一件落着.
ソートするときちんと全てのセルが並び替えられた.
具体的には漢字で始まるワードが二種類の場所に別れる.
(例)「鉛筆」という項目が二箇所に分かれていて完全にはソートできていない.
| A | B | C | |
| 1 | 項目 | 値段 | 個数 |
| 2 | 鉛筆 | 30円 | 1本 |
| 4 | 消しゴム | 50円 | 1個 |
| 5 | 消しゴム | 200円 | 5個 |
| 6 | シャープペン | 150円 | 1本 |
| 7 | シャープペン | 400円 | 3本 |
| 8 | ボールペン | 200円 | 1本 |
| 9 | ボールペン | 500円 | 3本 |
| 3 | 鉛筆 | 300円 | 12本 |
なぜこんなことが起きるのか調べてみると,理由はフリガナにあるらしい.
フリガナが設定されているセルではソート時にフリガナを考慮してソートするので,フリガナが設定されているセルと,設定されていないセルが混在しているとソート時に二箇に別れるようだ.
(尚,フリガナを表示するにはセルを右クリックして「ふりがなの表示」をチェックする)
つまり,解決するには全てのセルにフリガナを設定するか,全てのセルからフリガナを削除するか.の二択になる.前者はデータ量的にに不可能なので,今回は削除するほうを考える.
しかし,フリガナを削除するというコマンドは存在しない.
そこで,コピペをうまく利用する.
まずは,フリガナを削除したいシートをコピーする.
そしてコピーされたシートのセルを全て選択し,コピー元のシートに貼り付ける.
その際,形式を選択して貼り付けで数式を選ぶ.
最後にコピーしたシートを削除する.
数式を選択して貼り付けると,フリガナ情報がコピーされないので,結局全てのセルからフリガナを削除することができる.
これにて一件落着.
ソートするときちんと全てのセルが並び替えられた.
2013年6月11日火曜日
Gmailでラベルが付いていないのメールを検索する方法
ググるとよく見つかる方法が
label:(-label1 AND -label2 AND …)
と検索する方法.
しかし僕はラベルの数が50を超えているので,とてもじゃないがそんな方法は取れない.だから半ば諦めていたけど,ついにその方法を発見した.
Gmailでラベルなしメールを検索する方法 - 日記とメモ
これによれば,
has:nouserlabels
と検索すれば良い.しかし,これだと送信済みメールでラベルが付いていないものまでヒットしてしまうので,受信メールでかつラベルがないものは
has:nouserlabels AND -is:sent
と検索すれば良い.
label:(-label1 AND -label2 AND …)
と検索する方法.
しかし僕はラベルの数が50を超えているので,とてもじゃないがそんな方法は取れない.だから半ば諦めていたけど,ついにその方法を発見した.
Gmailでラベルなしメールを検索する方法 - 日記とメモ
これによれば,
has:nouserlabels
と検索すれば良い.しかし,これだと送信済みメールでラベルが付いていないものまでヒットしてしまうので,受信メールでかつラベルがないものは
has:nouserlabels AND -is:sent
と検索すれば良い.
2012年11月23日金曜日
メディアのバックアップを取る(dd コマンド)
発売時に購入したkobo touchを分解してみようと思い
まずはバックアップの取り方を勉強.
dd コマンド
これはメディアからイメージをそのまま取り出したりすることができるコマンドなのですが,使ったことが無いのでいまいち分からない・・・.
ググれば大抵の情報は出てくるのですが,自分で試してみないことには全てを理解することはできないので,実験してみました.
【実験】
1.使っていないUSBメモリをPCに挿し込みフォーマット
(BUFFALO製,1GB)
前方100MBをFAT32で,残り(約900MB)をntfsでフォーマットしました.
USBメモリ本体は/dev/sdd/
FAT32の領域は/dev/sdd1/
ntfsの領域は/dev/sdd2/
その後,FAT32とntfsのそれぞれに日本語で書かれたテキストファイルを保存.
(日本語なら文字化けするかどうかも確認できると思ったので)
2.各領域をアンマウント
(マウント状態でもできそうな感じでしたが念のため)
3.そしてddの実行.
(1)sdd,sdd1,sdd2をそれぞれ吸い出す.
sudo dd if=/dev/sdd of=~/hoge.dump
sudo dd if=/dev/sdd1 of=~/hoge1.dump
sudo dd if=/dev/sdd2 of=~/hoge2.dump
(2)次に各領域を削除(いわゆる未割り当て領域に)
(3a)hoge.dumpをsddにリストアしてみる
sudo dd if=~/hoge.dump of=/dev/sdd
無事にコピーが終了し,マウントすると中のテキストファイルもちゃんと読める.
バックアップを取るだけならこれで完了と言えそうです.
(3b)hoge1.dumpをsddにリストアしてみる
sudo dd if=~/hoge1.dump of=/dev/sdd
コピーが終了後,gpartedで領域を確認すると未割り当て領域のまま.
やはり失敗したかと思ったのですが,なぜかマウントできる!?
しかも中のテキストファイルも読める.プロパティを見ると,約100MBの空き領域.
・・・.
何これ・・・.意味分からん.
(3c)hoge2.dumpをsddにリストアしてみる
hoge1の場合とほぼ一緒になりましたが,
gparted上できちんとntfs領域になっていました.
つまり状態としては,最初から(1GBではなく900MBの)USBメモリに900MBのntfs領域がsdd1として作られているように見えます.もちろん中のテキストファイルもちゃんと読めます.
hoge1とhoge2の違いについての仮説
A,FAT32とntfsの違い?
B,hoge2の方は元々のサイズ(1GB)に近かったから上手く読めた?
C,gpartedの仕様でFAT32の方は読み込みに失敗しやすい?
結局よくわかりませんが,バックアップ&リストアにはhoge.dumpをsddにリストアすれば間違いなさそうです.
次回は kobo touch 分解に挑戦です.
まずはバックアップの取り方を勉強.
dd コマンド
これはメディアからイメージをそのまま取り出したりすることができるコマンドなのですが,使ったことが無いのでいまいち分からない・・・.
ググれば大抵の情報は出てくるのですが,自分で試してみないことには全てを理解することはできないので,実験してみました.
【実験】
1.使っていないUSBメモリをPCに挿し込みフォーマット
(BUFFALO製,1GB)
前方100MBをFAT32で,残り(約900MB)をntfsでフォーマットしました.
USBメモリ本体は/dev/sdd/
FAT32の領域は/dev/sdd1/
ntfsの領域は/dev/sdd2/
その後,FAT32とntfsのそれぞれに日本語で書かれたテキストファイルを保存.
(日本語なら文字化けするかどうかも確認できると思ったので)
2.各領域をアンマウント
(マウント状態でもできそうな感じでしたが念のため)
3.そしてddの実行.
(1)sdd,sdd1,sdd2をそれぞれ吸い出す.
sudo dd if=/dev/sdd of=~/hoge.dump
sudo dd if=/dev/sdd1 of=~/hoge1.dump
sudo dd if=/dev/sdd2 of=~/hoge2.dump
(2)次に各領域を削除(いわゆる未割り当て領域に)
(3a)hoge.dumpをsddにリストアしてみる
sudo dd if=~/hoge.dump of=/dev/sdd
無事にコピーが終了し,マウントすると中のテキストファイルもちゃんと読める.
バックアップを取るだけならこれで完了と言えそうです.
(3b)hoge1.dumpをsddにリストアしてみる
sudo dd if=~/hoge1.dump of=/dev/sdd
コピーが終了後,gpartedで領域を確認すると未割り当て領域のまま.
やはり失敗したかと思ったのですが,なぜかマウントできる!?
しかも中のテキストファイルも読める.プロパティを見ると,約100MBの空き領域.
・・・.
何これ・・・.意味分からん.
(3c)hoge2.dumpをsddにリストアしてみる
hoge1の場合とほぼ一緒になりましたが,
gparted上できちんとntfs領域になっていました.
つまり状態としては,最初から(1GBではなく900MBの)USBメモリに900MBのntfs領域がsdd1として作られているように見えます.もちろん中のテキストファイルもちゃんと読めます.
hoge1とhoge2の違いについての仮説
A,FAT32とntfsの違い?
B,hoge2の方は元々のサイズ(1GB)に近かったから上手く読めた?
C,gpartedの仕様でFAT32の方は読み込みに失敗しやすい?
結局よくわかりませんが,バックアップ&リストアにはhoge.dumpをsddにリストアすれば間違いなさそうです.
次回は kobo touch 分解に挑戦です.
2012年9月12日水曜日
Firefox の about:config 設定
about:config の備忘録。
1.browser.tabs.closeWindowWithLastTab を false
最後のタブを閉じてもブラウザが終了しないようになる
(最後のタブを閉じると何もページを読み込んでいないタブが表示される)
2.browser.search.openintab を true
検索バーでの検索結果が新しいタブで表示されるようになる
3.browser.link.open_newwindow.restriction の値を 0
JavaScript等で新しいウィンドウで開かれてしまうページも新しいタブで表示してくれる
これを設定しておけば、ほぼシンブルウィンドウでブラウジングできるようになる
4.
browser.newtab.url を file:///home/user/Dropbox/afoafo/hogehoge.html
browser.startup.homepage を file:///home/user/Dropbox/afoafo/hogehoge.html
新しいタブで開かれるページとホームページを指定する(ローカルのhtmlファイル)
そして、このローカルのhtmlファイルには自分のお気に入りの一覧をひたすら書きまくる
さらにこいつをDropboxに突っ込んでおいて、あらゆる環境でお気に入りを同期する
Firefox Syncなんか使うよりよっぽど便利
最低限の設定だと思ってる。
増えたら追加します
1.browser.tabs.closeWindowWithLastTab を false
最後のタブを閉じてもブラウザが終了しないようになる
(最後のタブを閉じると何もページを読み込んでいないタブが表示される)
2.browser.search.openintab を true
検索バーでの検索結果が新しいタブで表示されるようになる
3.browser.link.open_newwindow.restriction の値を 0
JavaScript等で新しいウィンドウで開かれてしまうページも新しいタブで表示してくれる
これを設定しておけば、ほぼシンブルウィンドウでブラウジングできるようになる
4.
browser.newtab.url を file:///home/user/Dropbox/afoafo/hogehoge.html
browser.startup.homepage を file:///home/user/Dropbox/afoafo/hogehoge.html
新しいタブで開かれるページとホームページを指定する(ローカルのhtmlファイル)
そして、このローカルのhtmlファイルには自分のお気に入りの一覧をひたすら書きまくる
さらにこいつをDropboxに突っ込んでおいて、あらゆる環境でお気に入りを同期する
Firefox Syncなんか使うよりよっぽど便利
最低限の設定だと思ってる。
増えたら追加します
2012年8月18日土曜日
Googleカレンダーで "第一・第三月曜日" のような繰り返し予定を作成する
はい。タイトル通りです。
こんな予定を作りたいと思って試したみたら、意外とテクニックが必要だったので。
まず失敗した方法。次に、アプローチを変えて成功した方法の順に書いてみようと思います。
・ステップ1:毎週の予定を作る
まずは繰り返し予定の基本中の基本。
予定作成画面で繰り返しのチェックボックスにチェックを入れると繰り返し設定の画面が飛び出す。
そこでプルダウンメニューから毎週を選ぶ。(というかデフォルトで毎週になってる)
これで毎週月曜日の予定が完成。
・ステップ2:隔週の予定を作る
じゃあプルダウンメニューに隔週ってのがあるのか!?
答えはノー。
じゃあ隔週の予定はどうやって作るの?
ここで繰り返し間隔のプルダウンメニューを開いて、2週間にする。
これで毎週の予定を2週間ごとに繰り返すっていう意味不明な予定ができるが、つまり隔週ってことになる。
これで隔週月曜日の予定が完成。
ステップ3:第一月曜日の予定を作る
ぶっちゃけ、ステップ2の時点で第一・第三月曜日の予定ができたと思っていました。
が、第五月曜日のある月にずれてしまうんですね。あくまで隔週月曜日だったので。(当たり前)
ではどうするか?
繰り返しを毎週から毎月に変更します。
そして、繰り返しの基準を日付から曜日に変更します。
これで毎月第一月曜日の予定が完成です。
ステップ4:第三月曜日の予定を作る
これで最後です。
お察しの通り、ステップ3と同様に第三月曜日の予定を作ります。
合わせ技によって、第一・第三月曜日の予定の完成です。
ちょっと工夫すると何でもできるようになる!(気がする。)
これだからGoogleは辞められないですね。
今回の場合、仮に
第一月曜日とか第三月曜日ってチェックボックスがあったら、そりゃもっと簡単だと思う
でも隔月の第一月曜日とか、三週間に一回の予定とか、そういうイレギュラーな予定を作ろうと思ったら、こういうフォーマットの方がずっとずっと融通利く。
というか、このフォーマットで作れない繰り返し予定は存在しないんじゃないか?
あるとすれば、それはもう不規則な繰り返し(無理に決まってる)
ぶっちゃけ、こんなふうに繰り返しとか使ってる人は全ユーザの10%にも満たないと思う。
でも、その10%を切り捨てない。
10%のために最良の機能を提供する。
そして、それを最小の機能で実現する。
Googleのモットーだろうね。
こんな予定を作りたいと思って試したみたら、意外とテクニックが必要だったので。
まず失敗した方法。次に、アプローチを変えて成功した方法の順に書いてみようと思います。
・ステップ1:毎週の予定を作る
まずは繰り返し予定の基本中の基本。
予定作成画面で繰り返しのチェックボックスにチェックを入れると繰り返し設定の画面が飛び出す。
そこでプルダウンメニューから毎週を選ぶ。(というかデフォルトで毎週になってる)
これで毎週月曜日の予定が完成。
・ステップ2:隔週の予定を作る
じゃあプルダウンメニューに隔週ってのがあるのか!?
答えはノー。
じゃあ隔週の予定はどうやって作るの?
ここで繰り返し間隔のプルダウンメニューを開いて、2週間にする。
これで毎週の予定を2週間ごとに繰り返すっていう意味不明な予定ができるが、つまり隔週ってことになる。
これで隔週月曜日の予定が完成。
ステップ3:第一月曜日の予定を作る
ぶっちゃけ、ステップ2の時点で第一・第三月曜日の予定ができたと思っていました。
が、第五月曜日のある月にずれてしまうんですね。あくまで隔週月曜日だったので。(当たり前)
ではどうするか?
繰り返しを毎週から毎月に変更します。
そして、繰り返しの基準を日付から曜日に変更します。
これで毎月第一月曜日の予定が完成です。
ステップ4:第三月曜日の予定を作る
これで最後です。
お察しの通り、ステップ3と同様に第三月曜日の予定を作ります。
合わせ技によって、第一・第三月曜日の予定の完成です。
ちょっと工夫すると何でもできるようになる!(気がする。)
これだからGoogleは辞められないですね。
今回の場合、仮に
第一月曜日とか第三月曜日ってチェックボックスがあったら、そりゃもっと簡単だと思う
でも隔月の第一月曜日とか、三週間に一回の予定とか、そういうイレギュラーな予定を作ろうと思ったら、こういうフォーマットの方がずっとずっと融通利く。
というか、このフォーマットで作れない繰り返し予定は存在しないんじゃないか?
あるとすれば、それはもう不規則な繰り返し(無理に決まってる)
ぶっちゃけ、こんなふうに繰り返しとか使ってる人は全ユーザの10%にも満たないと思う。
でも、その10%を切り捨てない。
10%のために最良の機能を提供する。
そして、それを最小の機能で実現する。
Googleのモットーだろうね。
登録:
投稿 (Atom)








