2019/11/25

sudo しないとアクセスできないファイルをローカルにコピーする方法

普通にscpとかを使ってもできない.
以下のようにsshすればできる.

ssh -t user@host 'echo パスワード |sudo -S cat ファイルパス' > ローカルファイル名

2019/11/06

異なるファイルが置かれた複数のデスクトップを切り替えながら使う方法

Dropboxがシンボリックリンク非対応になった問題を解決する方法 を探していたら,副産物として,デスクトップを簡単に切り替える方法を考えついたので,メモを残す.

タイトルに有る通り,別々のファイルが置かれたデスクトップを複数用意することができる方法であって,MacのMission Controlのように,隣のデスクトップに移動しても同じファイルがありつつ,ウィンドウを広げるスペースを確保する話とは全く異なるので注意.
つまり,例えば,仕事用のファイルを置いたデスクトップとプライベート用ファイルを置いたデスクトップをそれぞれ分けて使うことが可能になったりする.

使うのは,bindfsというツール.
bindfs は FUSEの仕組みを使って,任意のファイルシステムをマウントできるものらしい.
とりあえず以下でインストール.


brew cask install osxfuse
brew install bindfs

使い方は簡単で,

bindfs somedir/ mountdir/

とすると,somedirがmountdirにマウントされる.
これを使い,以下のように,任意のフォルダ(somedir)を~/Desktopにマウントすると,Desktopのファイル群がsomedirの中身に入れ替わる.
切り替えて戻しても,ファイルの配置はそのまま.

bindfs -o volname=Desktop ~/somedir/ ~/Desktop/

戻すときはアンマウント(ディスクを取り出す)すればOK.

Dropboxがシンボリックリンク非対応になった問題を解決する方法


先日,Dropboxから,今後はシンボリックリンクのファイルは同期しないようにする旨のアナウンスが来ていた.
Macでシンボリックリンクを使った 複数PCのDesktopをDropboxを使って同期する方法 が使えなくなってしまい頭を抱えてしまった.

試行錯誤の末,bindfsを使えば解決するばかりか,より良い実装にできそうということがわかったので,メモを残す.


悩んだ過程は以下の通り.

シンボリックリンクでDropboxは同期してくれない.
Googleドライブ,OneDriveも試したが,同じ仕様.
SugerSincはできるっぽいけど無料は90日限定.

ハードリンクならどうか.
ハードリンクは,High Sierra以降はファイルシステムとしてAPFSが強要されるため,ディレクトリのハードリンクは不可.
逐一ファイルごとにハードリンクを張るスクリプトを組むのは面倒臭すぎる...


結局たどり着いたのが,bindfs.
bindfs は FUSEの仕組みを使って,任意のファイルシステムをマウントできるものらしい.

とりあえずインストール.


brew cask install osxfuse
brew install bindfs

使い方は簡単で,

bindfs somedir/ mountdir/

とするだけ.
オプションを付けると色々とポリシーを変えたりできるらしい.
シンボリックリンクで実現していたときと同様に,DesktopをDropbox内にマウントしても,マウントされたファイルは同期対象にはならないので,Dropboxディレクトリ自体をDesktopディレクトリにマウントしてしまおう.
(このような使い方はAppleは想定していないと思うので,自己責任で)

以下のコマンドを打つと,Dropboxディレクトリに入っているものが,Desktopに表示されるようになる.

 bindfs -o volname=Desktop ~/Dropbox\ \(個人用\)/ ~/Desktop/

アンマウント(ディスクを取り出し)すると,元のDesktopに戻ります.
再度マウントするとちゃんと元の配置に戻るようになっている.


当然,再起動するとマウントされていない状態に戻るので,コマンドを打ち直す必要があります.
また,副作用として,ディスクとして扱われるのでDesktop外にファイルをドラッグすると,移動ではなくコピーになってしまいます.
コマンドキーを押しながらドラッグすると,移動になる(ただし,厳密には移動ではなく,コピーしてから削除なので,大きなファイルを移動するときはDropboxから直接動かしたほうが良い).

これでめでたく,複数PCのDesktopを同期することができました.

2019/07/11

Mac版パワポに描いた図にpngの図を取り込んで「図として保存」したら解像度が低くなってしまったときの対応法.

Mac版パワポに描いた図にpngの図を取り込んで「図として保存」したら解像度が低くなってしまったときの対応法.

以前できていた方法がいつの間にかできなくなっていたので,再度方法を模索.
http://ippotsukonamarumaru.blogspot.com/2018/05/macofficepdf.html

試行錯誤の結果,PDF化してから取り込めばOKということがわかった.
texclipから取り込む場合,epsとして保存した後,プレビューで開き,pdfとして保存し,さらにパワポに取り込み,図として保存すればOK.

手順が増えて面倒だけど,epsからなら完全ベクタ画像として出力できるのでいいかな.

2019/06/03

Google Compute Engine (GCE) で再起動してもリセットしてもどうにもならなくなったときの対処法

Google Compute Engine (GCE) で再起動してもリセットしてもどうにもならなくなった.
GCPのコンソール上では,正常に起動していることになっているが,サイトは表示されず,sshでもログインできない.
pingを打っても通らないし,nmapしてみてもホストが落ちていると言われる.

参った...

どうしたものかといろいろ試行錯誤しているうちに,シリアルポート接続を有効化というオプションを発見.
なるほど,こんな機能があるのか.
チェックを入れて,シリアルコンソールに接続というボタンからログインできた.

どうやらファイルシステムに問題が起きていたらしく,ログイン後,ちょっといじったらなんとか治った.



2019/04/02

Djangoの国際化のmakemessagesでワイルドカードを使う方法

Djangoの国際化のmakemessagesでワイルドカードを使う方法.

Djangoサイトを国際化(多言語対応)するときに打つコマンド,makemessages でワイルドカードを使ってディレクトリを除外したりしたいとき,以下のようにすればOK.

makemessages -l en --ignore venv\*

または,

makemessages -l en --ignore "venv*"

上記の例では,venvで始まるディレクトリを無視している.

2019/03/30

Djangoで自前のformでデフォルトのパスワードvalidationをする方法.

Djangoで自前のformでデフォルトのパスワードvalidationをする方法.

訳あって,Userモデルを拡張したモデル(UserPrivate)に対して,ModelFormではなく自前のformでユーザの追加をしたくなった.
普通にformを作ってみると,デフォルトのパスワードvalidationが有効にならない.

下記のようにすることで,settingsのAUTH_PASSWORD_VALIDATORSに登録されたvalidatoionを実行してくれる.
usernameとpasswordしか入力させないフォームなので,self.instance.usernameしか代入していないが,firstnameとかemailとかも場合によっては必要になる.

本当はもっとうまい方法がありそうなものだけど,よくわからん.
知っている人がいたら教えてほしい.



from django.contrib.auth.password_validation import validate_password


class UserPrivateAddForm(forms.ModelForm):
    """アカウント追加フォーム"""
    username = forms.CharField(
        label='ユーザID',
        required=True,
    )
    password = forms.CharField(
        label='パスワード',
        widget=forms.PasswordInput,
        help_text='パスワードを入力してください.'
    )
   
    def clean_password(self):
        # パスワードのvalidation時に username と似た値を禁止するUserAttributeSimilarityValidatorを機能させるためにusernameを代入
        password = self.cleaned_data.get('password')
        self.instance.username = self.cleaned_data.get('username')  # usernameを代入
        validate_password(
            self.cleaned_data['password'],
            self.instance  # ここでusernameの入ったインスタンスを渡す必要がある
        )  # デフォルトのパスワードvalidation
        return password
   
    def save(self, commit=True):
        user_private = super().save(commit=False)
        user_private.set_password(self.cleaned_data["password"])
        if commit:
            user_private.save()
        return user_private
   
    class Meta:
        model = UserPrivate
        fields = [
            'username',
            'password',
        ]

2019/02/06

IEICEの研究会テンプレートで¥refコマンドに無駄なドットがつく問題の解決法

電子情報通信学会の研究会のLaTeXテンプレートで,refコマンドを使うと,「第2.章」のようにドットが入ってしまう問題を修正する方法.
普通のクラスファイルなら,¥usepackage{secdot}を使えば済むが,IEICEの場合は以下のようにする必要がある.

ieicej.clsの中の

\renewcommand{\thesection}{\@arabic\c@section.}
\renewcommand{\thesubsection}{\thesection\,\@arabic\c@subsection}

となっている部分を書き換え,ドットの位置を以下のようにする.

\renewcommand{\thesection}{\@arabic\c@section}
\renewcommand{\thesubsection}{\thesection.\,\@arabic\c@subsection}

さらに,プリアンブルに ¥usepackage{secdot} を書き加えればOK.

2019/01/15

PyCharmでPYTHONPATHを追加して独自モジュールを追加する方法

pythonでは上位のディレクトリに位置するモジュールを相対パスでimportできない.
別のところにおいてある独自モジュールを追加するためには,PYTHONPATHを追加する必要がある.
ターミナルでやるなら,exportを打つだけだが,IDEだとどうするのかいいのかわからなかったので調べた.

venvのbin/activateにexportを書く方法もあるが,動きはするものの,これだとPyCharm側でコードの警告が消えない.

PyCharm側でPYTHONPATHを追加すれば,警告は出ない.
方法は以下の通り.

Preferences => Project Interpreter => [歯車マーク] => Show all => [ディレクトリ階層マーク] => [プラスマーク]
と進んでパスを追加.