2018年12月5日水曜日

DjangoのChoiceFieldの値を後から選択する方法

Django(2.1系)のFormを実装してまして、初期化後にChoiceFieldを変えたいという場面があったのですが、中々よい解決策が見当たらなかったのでメモ。



ざっくりこんな感じで用意している場合
#model.py

class Category(models.Model):
    text = models.CharField()


#form.py

class CategoryCreateForm(ModelForm):
    category = ChoiceField(queryset=Category.objects.none(), empty_label='---', error_messages={'invalid_choice':'error'})

    class Meta:
        model = Category
        fields = ['text']


よく解決策として出てくるのが、CreateFormに__init__を用意して引数で渡しているのを見かけるのですが、正しく値が渡らず上手くいきませんでした。 Djangoのバージョン問題?

NGパターン

def __init__(self, category, *args, **kwargs):
    super(QuestionCreateForm, self).__init__(*args, **kwargs)



単純にview.pyでinitialに設定すればOKでした。

view.py

form = CategoryCreateForm()
#本当は必要なselectのoptionが設定されるようにfilterするのがよい
form.fields['category'].queryset = Category.objects.all()
#選択したいvalueを設定すればよい
form.fields['category'].initial = Category.objects.get(id=1).id

2018年5月29日火曜日

Visual Studio CodeでDjangoを使っているとpylintのエラーが出る件

Visual Studio CodeでDjangoのプロジェクトを扱っていると、クエリのコードで良くClass ' has no objects member`の警告が出てくる事があります。

これは地味に邪魔なので解決する方法


pylintの追加モジュールをインストール。

pip install pylint-django

Visual Studio Codeの基本設定 > 設定 > ユーザ設定に下記を追加。

"python.linting.pylintArgs": [
     "--load-plugins=pylint_django"
],

以上。

2018年5月16日水曜日

GCP上のwordpressにLet's encryptを設定する方法

Google Cloud Platformは最近頑張っていて、Googleアカウントがあれば、無料でサーバが利用できます。
サーバにwordpressも簡単に設定できるので非常に便利。

wordpress on GCPはこちら

上記からwordpress入れても、非SSLのままでちょっと勿体ないです。
最近のブラウザは厳しくなっているので保護されてない通信として警告表示になってしまいます。

無料で使えるSSL証明書発行サービス Let’s Encryptを設定する方法をまとめました。


まずは必要なものをインストール。certbotはLet's Encryptの証明書更新作業を自動化するソフトウェア。

sudo apt-get install certbot python-certbot-apache -t jessie-backports


一応cronに登録されているか確認する。ちゃんと登録されていれば、有効期限の近いSSL証明書を更新してくれる。

cat /etc/cron.d/certbot


"example.com"にはサーバ上で動かしているドメインに変える。カンマ区切りで複数ドメインも設定可能。緊急連絡先のメアドが必要。

certbot certonly --agree-tos --webroot -w /var/www/html/ -d example.com 


sudo vi /etc/apache2/sites-available/default-ssl.conf
上記ファイル内に下記の様に記載。証明書のパスは要確認。
SSLCertificateFile "/etc/letsencrypt/live/example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/example.com/chain.pem"

sudo vi /etc/apache2/sites-available/wordpress.conf
上記ファイル内に下記の通り、ドメイン設定追加。
ServerName www.example.com
Redirect / https://www.example.com/

ServerName example.com
Redirect / https://example.com/

サーバを再起動して反映させる。
sudo systemctl restart apache2


2017年12月27日水曜日

Officeの保護ビューを解除する方法

NASを変えたら、NAS上のファイルをOfficeで開く度に、保護ビュー(このファイルは、インターネット上の場所から取得されており、安全ではない可能性があります。クリックすると詳細が表示されます。)が出てきて編集を有効にするを押さないと編集出来なくなりました。

これって地味に面倒ですよね。
解除(無効)にする方法を調べたのでメモしておきます。

方法は大きく3つあると思います。


■方法1:NAS・共有フォルダのアドレスを名前に変更する

接続しているNASや共有フォルダのアドレスが\\192.168.0.100\とかIPアドレスになっていると、保護ビューが動作してしまうようです。
接続しているネットワークが変わると同じアドレスで別の端末があったりするので安全性が確認出来ないって事だと思います。

名前で接続できない場合、いくつか方法あるかと思いますが、WINSサーバをインストールしてあげると上手くいく場合があります。
参照:WINSサーバをインストールする方法
https://technet.microsoft.com/ja-jp/library/ff710463(v=ws.10).aspx
一人だけ解決すればよい場合はhostsファイルに書くのが一番楽ですね。
windowsだとC:\Windows\System32\drivers\etc\hostsにあるファイルに下記の様に書くだけです。

192.168.0.100  share
\\share\にて接続可能になる。※IPは共有フォルダのIPを指定してください。


■方法2:Officeの設定で信頼できる場所に共有フォルダを登録する

これはアプリケーション側で対応する方法です。
Office設定で信頼できる場所を登録する事で保護ビューが出なくなります。
但し、IPアドレスが含まれているとセキュリティ上信頼されないようです。従いまして方法1をやった後に試す方法になります。
参照:信頼できる場所を追加、削除、変更するhttps://support.office.com/ja-jp/article/%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E5%A0%B4%E6%89%80%E3%82%92%E8%BF%BD%E5%8A%A0%E3%80%81%E5%89%8A%E9%99%A4%E3%80%81%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-7ee1cdc2-483e-4cbb-bcb3-4e7c67147fb4


■方法3:各Officeのセキュリティ設定の変更

各Officeアプリケーション上で下記設定する事で解除可能。
ファイル > オプション > セキュリティセンター > セキュリティセンターの設定 > 保護ビューにて、「安全ではない可能性のある場所のファイルに対して、保護ビューを有効にする」のチェックを外して、OKボタン。




2017年11月15日水曜日

Visual Studio Codeでpylintのエラーが出る件

Visual Studio Code(VSC)を更新したらpylintがエラーになるようになりました。。

Linter pylint is not installed


エラー内容的にはpylintがインストールされてませんとの事ですが問題なくされている事は確認出来きております。
試しにコンソールからpip install pylintを実行するとRequirement already satisfiedとの事が確認できました。
VSC側でinstall pylintボタンが表示されておりましたので、押下した所下記エラー

PS > C:\Users\??\AppData\Local\Programs\Python\Python35\python.exe -m pip install pylint
& : 用語 'C:\Users\??\AppData\Local\Programs\Python\Python35\python.exe' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:3
+ & C:\Users\??\AppDa ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (c...on35\python.exe:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException


どうやらユーザ名が日本語の為、文字化けしているようでした。
VSCのファイル > 基本設定 > 設定を開いて、右側の設定ファイルに下記の通り正しいファイルパスを追加。

{
    ......(その他設定),
    "python.pythonPath": "C:\\Users\\(名前)\\AppData\\Local\\Programs\\Python\\Python35\\python.exe"
}

上記設定して再起動した所、エラーは出なくなりました。

2017年10月5日木曜日

海外からの不正利用を防ぐサーバ設定



こんな事ないでしょうか?

・なんだかサーバの負荷が高い
・情報がでたらめな会員登録が増えた
・決済代行からの請求額が上がった(オーソリ料)
・決済代行会社から連絡が来てお宅のサーバからクレジットカードの総当たり攻撃が来てますのような連絡を受けた。

上記の場合だと大体踏み台にされてクレカ情報の有効性チェックをやられてると想定されます。

WAFとかEBでIP制限出来ればそれで完了ですが、利用サービスによってはIP制限が出来なかったりします。

そうするとサーバ側で対応する必要が出てきます。

IP制限するならiptableかhtaccessになるかと思います。
iptableが分かる方も特に問題ないので説明省略します。



htaccessはサーバのドキュメントルートにあると思いますので、下記の様な設定を追加すればOKです。


  # REMOTE_ADDRで接続元IPが取得できますが、ロードバランサーやプロキシがあるとちゃんと取れなかったりしますので、その場合はヘッダ情報のHTTP:X-Forwarded-Forから取得しましょう。
 RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$ [OR]
 RewriteCond %{HTTP:X-Forwarded-For} ^192\.168\.0\.100$ [OR]
  # 192.168.0.100は仮のIPなので、除外したいIPアドレスを入れてください。

  #除外したいIPを範囲で指定する場合は下記の通り途中まで記載すればOK。先頭が192.168で始まるIPを除外できます。
  RewriteCond %{HTTP:X-Forwarded-For} ^192\.168 [OR]
  #正規表現なので下記のように"^"が付いてないとIPアドレスのいずれかに192.168が入るという意味になりますので注意です。例えば100.192.168.1もヒットします。
  RewriteCond %{HTTP:X-Forwarded-For} 192\.168 [OR]

  #連続(コメント行や空行除いて)でRewriteCondを記載する時は[OR]を最後につけますが、最後は無しでOKです。
  RewriteCond %{HTTP:X-Forwarded-For} ^192\.168\.0\.100$
  #再度にRewriteRuleでどのURLの時どこに飛ばすか記載します。任意のURL(.*)の時、https://xxx.com/に302リダイレクトをするという意味です。
  RewriteRule .* https://xxx.com/ [R=302,L]


最後に上記をまとめた記載例です。

 RewriteCond %{REMOTE_ADDR} ^192\.168\$ [OR]
 RewriteCond %{REMOTE_ADDR} ^192\.167\.0\.100$ [OR]
 RewriteCond %{REMOTE_ADDR} ^192\.167\.0\.200$
 RewriteRule .* https://xxx.com/ [R=302,L]


リダイレクト先は自由ですが、他人のサイトは迷惑が掛かりますのでやめておきましょう。
自社サイトであればSorryページなんかを作って、海外のお客様はご利用できませんと記載しておけばいいと思います。






2017年5月3日水曜日

各社のノートPCキーボード配列を比較してみました



ノートPCを購入する際にキーボードの配列は意外と重要ですよね。

購入条件に下記ポイントが気になるかと思います。

左下にファンクションキーがあるのか、それともコントロールキーがあるのか?

エンターキーは小さすぎないか?

デリートキーは遠すぎないか?


それでは各社のノートPC(割とフラグシップモデル)のキーボードを見て行きましょう。


VAIO Z

左下はCtrl、Fn、Winキーの順ですね。
スペースキーが意外と短いです。
エンターやバックスペースは割と普通ですかね。
矢印キーは逆T字の配列です。




HP EliteBook Folio 1020

左下はCtrl、Fn、Winキーの順。
スペースキーはマウスパッドと同じくらい。
エンターが細くなっております。
慣れてないとエンターとバックスペースの辺りは打ち間違えそうですね。




DELL  XPS 13

左下はCtrl、Fn、Winキーの順。
スペースキーはちょっと短め。
エンターが縦に細くなっております。
右側のシフトキーが短いめですね。




Lenovo X1 Carbon

左下はFn、Ctrl、Winキーの順。
このファンクションキーの位置が自分は苦手です。。
スペースキーはちょっと短め。矢印キー付近にページアップ、ページダウンキーがあります。

キー配列以外が良い場合はキーマッピングツールなんかでキーを入れ替えるのがいいと思います。


他にもキーボードだとキーピッチ(大きさ)やキーストローク(押し込み具合)なんかも気になると思います。

購入前にはサイトでキー配列を確認してあたりを付けて、量販店で試打して決めるのが無難かと思います。