Symfoware

Symfowareについての考察blog

FreeBSD 11 rootのssh接続の有効化

FreeBSD 11を仮想環境にインストールしました。
FreeBSD 11.0-RELEASEを仮想環境(UbuntuのKVM)にインストール

別の端末からrootでssh接続できるように変更します。



sshd_configの編集



sshの設定ファイル/etc/ssh/sshd_configを適当なエディタで開きます。
今回はviを使用しました。


vi /etc/ssh/sshd_config




設定ファイル中、


#PermitRootLogin no



となっている箇所を探します。
先頭のコメント「#」を削除して、noをyesに変更。


PermitRootLogin yes




ファイルを保存したら、sshdサービスを再起動。


/etc/rc.d/sshd restart




これで別の端末からrootでssh接続できるようになりました。
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/03/20(月) 15:51:20|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

FreeBSD 11.0-RELEASEを仮想環境(UbuntuのKVM)にインストール

FreeBSD 11.0-RELEASEをインストールする手順をメモしておきます。

過去の記事を参考にしました。
FreeBSD 10.0-RELEASEを仮想環境(UbuntuのKVM)にインストールする



インストーラーの取得



こちらからインストーラーを取得します。
https://www.freebsd.org/ja/where.html

733_01.png

733_02.png


FreeBSD-11.0-RELEASE-amd64-bootonly.isoをダウンロードしてきます。




仮想OSの作成



virt-managerから新しい仮想マシンの作成を実行。
以下、スクリーンショットを貼り付けておきます。

733_03.png


ダウンロードしたisoイメージを指定。

733_04.png

733_05.png


仮想ディスクのフォーマットはデフォルトの「qcow2」を選択しました。

733_06.png

733_07.png

733_08.png

以前はパフォーマンスオプションを変更しないとディスクのIOが遅かったのですが、
Ubuntu 16.04 + KVMでは解消されているようです。

こちらの手順は不要でした。
Ubuntu KVM上のFreeBSDのインストールが遅い場合の解決方法






インストール



実際のインストール手順です。
インストーラーが起動したら、そのままエンターキーを押下。

733_09.png


Installが選択されている状態でエンター。

733_10.png


キーボードレイアウトの選択です。
「Japanese 106」を選択してエンターキーを押下。

733_11.png


一番上の「Continue with jp.106.kbd keymap」を選択してエンター。

733_12.png


ホスト名を適当に入力します。
今回は「freebsd11」としました。

733_13.png


インストールオプションは、デフォルトの「lib32」「ports」が選択された状態でOK。

733_14.png


続いてネットワークの設定です。

733_15.png

733_16.png


IPv4の設定を有効化。

733_17.png


固定IPを指定したかったので、DHPCの使用はNoを選択しました。

733_18.png


IPアドレス、サブネット、デフォルトゲートウェイを入力します。

733_19.png


IPv6の設定を行うかの選択肢です。
今回は使用しないため、Noを選択しました。

733_20.png


DNSサーバーのIPアドレスを指定します。

733_21.png


ダウンロードサイトを選択します。
「ftp://ftp2.jp.frebsd.org」を選択しました。

733_22.png


パーティションの設定です。
今回はZFSにしてみます。

733_23.png


ZFSの設定はデフォルトです。

733_24.png

733_25.png


今回は1つですが、使用するディスクにチェックをつけます。
(選択状態でスペース押下)

733_26.png

733_27.png


Yesを選択してZFSパーティションの内容を確定します。

733_28.png


インストールが始まりました。

733_29.png


途中でrootのパスワードを尋ねられます。
適当にパスワードを2回入力します。

733_30.png


続いてタイムゾーンの指定です。
5 Asiaを選択。

733_31.png


その後、18 Japanを選択。

733_32.png


JSTで良いかの確認です。Yesで確定します。

733_33.png


日付と時刻の設定画面が表示されますが、両方Skipしました。

733_34.png

733_35.png


インストールするサービスはデフォルトの「sshd」「dumpdev」を選択。

733_36.png

733_37.png


root以外のユーザーを追加するかの確認です。
特に追加しないのでNoを選択。

733_38.png


最後にExitを選択してインストーラーを終了します。

733_39.png


手動で設定ファイルを編集するかの確認です。
編集しないのでNoを選択。

733_40.png


Rebootで再起動を実行します。

733_41.png


これでインストール完了です。

再起動後loginプロンプトが表示されたら

login: root
Password: (インストール中入力したパスワード)

を入力します。

733_42.png


無事ログインできました。

733_43.png
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/03/20(月) 15:34:44|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

CodeIgniter 3 メンテナンスや移転ページの簡単な設置方法

CodeIgniter 3を使用しているwebサイトで、メンテナンス中の表示や、
サイトの移転ページの表示に簡単に切り替えられないか調べてみます。


Hook



CodeIgniterで簡単メンテナンスモード

こちらのページを参考にさせていただきました。
Hookを使用して、別のページを表示させます。


Hookについては以前調べたことがあります。
CodeIgniter 3 処理のフック(General Topics - Hooks - Extending the Framework Core)



まず、設定ファイルを変更しHookを有効にします。

・application/config/config.php

enable_hooksをtrueに変更。


  1. /*
  2. |--------------------------------------------------------------------------
  3. | Enable/Disable System Hooks
  4. |--------------------------------------------------------------------------
  5. |
  6. | If you would like to use the 'hooks' feature you must enable it by
  7. | setting this variable to TRUE (boolean). See the user guide for details.
  8. |
  9. */
  10. $config['enable_hooks'] = TRUE;






最初に処理されるpre_systemに、呼び出す関数の指定を追加。

・application/config/hook.php


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. /*
  4. | -------------------------------------------------------------------------
  5. | Hooks
  6. | -------------------------------------------------------------------------
  7. | This file lets you define "hooks" to extend CI without hacking the core
  8. | files. Please see the user guide for info:
  9. |
  10. |    https://codeigniter.com/user_guide/general/hooks.html
  11. |
  12. */
  13. $hook['pre_system'][] = array(
  14.     'class' => '',
  15.     'function' => 'dummy',
  16.     'filename' => 'move.php',
  17.     'filepath' => 'hooks'
  18. );





呼び出すmove.phpでhtmlの表示まで行ってしまう作戦です。
呼び出すfunctionは存在しない名前でOKでした。



メンテナンス、移転ページを表示するファイルを配置します。


・application/hooks/move.php


  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  6. <title>URL変更</title>
  7. </head>
  8. <body>
  9. 移転しました。<br>
  10. (move.phpで表示)
  11. </body>
  12. </html>
  13. <?php
  14. // exitで処理を終了させないと、コントローラーの呼び出しが実行されてしまう
  15. exit();






表示



こんな感じで、どのURLでもmove.phpの内容が表示されるようになりました。

732_01.png



関連記事

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

  1. 2017/03/16(木) 22:41:02|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

CodeIgniter 3 自分で作成したモデルを継承する

CodeIgniter 3でCI_Modelを継承しモデルを定義。

・Base_model


  1. <?php
  2. // Base_modelを継承したモデル
  3. // Controllerからはこれを使用したい
  4. class Ext_model extends Base_model {
  5.     
  6.     public function say() {
  7.         echo 'Ext_model'.PHP_EOL;
  8.     }
  9.     
  10. }




このモデルを再度継承して拡張モデルを定義したい。

・Ext_model


  1. <?php
  2. // CI_Modelを継承したモデル
  3. // これを継承元としたい
  4. class Base_model extends CI_Model {
  5.     
  6.     public function say() {
  7.         echo 'Base_model'.PHP_EOL;
  8.     }
  9.     
  10. }




この状態で使用するとエラーになります。

・Test.php


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     // 作成した継承モデルの呼び出し
  5.     public function index() {
  6.         
  7.         $this->load->model('ext_model');
  8.         $this->ext_model->say();
  9.         
  10.     }
  11.     
  12. }





# php index.php test
PHP Fatal error: Class 'Base_model' not found in /var/dev/php/ci3/application/models/Ext_model.php on line 5

Fatal error: Class 'Base_model' not found in /var/dev/php/ci3/application/models/Ext_model.php on line 5

A PHP Error was encountered

Severity:    Error
Message:     Class 'Base_model' not found
Filename:    /var/dev/php/ci3/application/models/Ext_model.php
Line Number: 5

Backtrace:




まあ、Base_modelがロードされていないので当然なのですが。





解決策1



Base_modelがロードされていないことが原因なので、事前にロードしてやります。


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     // 作成した継承モデルの呼び出し
  5.     public function index() {
  6.         
  7.         // 事前にbase_modelをロード
  8.         $this->load->model('base_model');
  9.         $this->load->model('ext_model');
  10.         $this->ext_model->say();
  11.         
  12.     }
  13.     
  14. }




# php index.php test
Ext_model




動くには動きますし、modelのautoloadに指定してしまえば良いのですが、
あんまりしっくりきません。





解決策2



解決策1と似たような発想で、Ext_modelにBase_modelがロード済みか
チェックするロジックを入れてしまいます。

・Ext_model


  1. <?php
  2. // Base_modelを継承したモデル
  3. // Controllerからはこれを使用したい
  4. // 事前にBase_modelがロード済みかチェック
  5. if (!class_exists('Base_model')) {
  6.     // 未ロードならロード
  7.     get_instance()->load->model('base_model');
  8. }
  9. class Ext_model extends Base_model {
  10.     
  11.     public function say() {
  12.         echo 'Ext_model'.PHP_EOL;
  13.     }
  14.     
  15. }




これで呼び出せるようになりました。


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     // 作成した継承モデルの呼び出し
  5.     public function index() {
  6.         
  7.         $this->load->model('ext_model');
  8.         $this->ext_model->say();
  9.         
  10.     }
  11.     
  12. }




# php index.php test
Ext_model







解決策3



Hookとspl_autoload_registerの組み合わせを試してみます。

CodeIgniter 3 処理のフック(General Topics - Hooks - Extending the Framework Core)
PHP spl_autoload_registerでautoloadを自前で実装


※以下、例外処理のない適当な実装です。

まずHookを有効化。
application/config/config.phpのenable_hooksをtrueにします。


  1. /*
  2. |--------------------------------------------------------------------------
  3. | Enable/Disable System Hooks
  4. |--------------------------------------------------------------------------
  5. |
  6. | If you would like to use the 'hooks' feature you must enable it by
  7. | setting this variable to TRUE (boolean). See the user guide for details.
  8. |
  9. */
  10. $config['enable_hooks'] = TRUE;




application/config/hooks.phpを編集
pre_systemでspl_autoload_registerを登録します。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. /*
  4. | -------------------------------------------------------------------------
  5. | Hooks
  6. | -------------------------------------------------------------------------
  7. | This file lets you define "hooks" to extend CI without hacking the core
  8. | files. Please see the user guide for info:
  9. |
  10. |    https://codeigniter.com/user_guide/general/hooks.html
  11. |
  12. */
  13. $hook['pre_system'][] = spl_autoload_register(function($className) {
  14.     // Base_modelの解決
  15.     get_instance()->load->model($className);
  16. });




これで動いてくれました。



わかりやすさから、解決策2のモデルクラスの先頭でチェックするのが良さそうでした。



関連記事

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

  1. 2017/02/14(火) 00:02:13|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Python webサーバー、フレームワークを使用せずにwebアプリ作成

個人的なツール用として簡単なwebアプリを作成したかったのですが、
なんとか素のPythonだけで実装できないか考えてみました。


BaseHTTPServer,SimpleHTTPServer



Python 2系の場合、BaseHTTPServerが標準で組み込まれています。
※Python 3系ではhttp.server

これらを使用すれば良さそうです。

作成するwebアプリでは、htmlやjsファイルは通常通りget。
javascriptからのデータ取得はPOSTのみで行うことにし、
実装を簡単にしました。



POSTデータの解析



POSTデータの解析をどうやれば良いかわからず探したところ、
このドキュメントが参考になりました。

BaseHTTPServer – web サーバを実装するベースクラス

cgi.FieldStorageを使用すれば解析できそうです。



サンプルアプリケーション



アプリケーションは
・index.html
・app.js
・view.py
の3つのファイルで構成しました。

名前を入力すると、応答してくれる簡単なものです。

731_01.png


・index.html


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Simple Web</title>
  6.     <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  7.     <script type="text/javascript" src="./static/js/app.js"></script>
  8. </head>
  9. <body>
  10. <h3>Pythonのみで簡易Webアプリ</h3>
  11. <input type="text" id="name">
  12. <input type="button" id="echo" value="ajaxでデータ取得">
  13. <div id="result"></div>
  14. </body>
  15. </html>




・app.js


  1. $(function() {
  2.     
  3.     // 入力された値をPOSTで送信
  4.     // 応答を表示する
  5.     $('#echo').on('click', function(){
  6.         var name = $('#name').val();
  7.         $.ajax({
  8.             type: 'POST',
  9.             dataType: 'json',
  10.             data: {'name':name},
  11.             url: 'echo',
  12.         }).done(function (data) {
  13.             $('#result').html(data.message);
  14.         });
  15.     });
  16.     
  17. });




・view.py


  1. # -*- coding: utf-8 -*-
  2. import cgi
  3. import json
  4. import BaseHTTPServer
  5. import SimpleHTTPServer
  6. class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
  7.     
  8.     # POSTの実装(GETは継承元にある)
  9.     def do_POST(self):
  10.         
  11.         # リクエストに対応したメソッドを呼び出す
  12.         route = self.path.split('/')[-1]
  13.         if not hasattr(self, route):
  14.             self.send_response(500)
  15.             self.end_headers()
  16.             return
  17.         
  18.         # POSTデータの解析
  19.         form = self._parse_form()
  20.         response = getattr(self, route)(form)
  21.         
  22.         # レスポンス作成
  23.         self.send_response(200)
  24.         self.send_header("Content-type", 'application/json')
  25.         self.send_header("Content-Length", len(response))
  26.         self.end_headers()
  27.         self.wfile.write(response)
  28.         
  29.         
  30.     def _parse_form(self):
  31.         if 'Content-Type' not in self.headers:
  32.             return None
  33.         
  34.         # POSTデータがあれば内容を解析する
  35.         return cgi.FieldStorage(
  36.             fp=self.rfile,
  37.             headers=self.headers,
  38.             environ={
  39.                 'REQUEST_METHOD':'POST',
  40.                 'CONTENT_TYPE':self.headers['Content-Type'],
  41.             }
  42.         )
  43.     
  44.         
  45.         
  46.     # --- router
  47.     def echo(self, form):
  48.         
  49.         name = u'名無し'
  50.         
  51.         # データが送信されていれば、内容を応答
  52.         if 'name' in form:
  53.             name = form['name'].value
  54.         
  55.         message = u'%sさんこんにちは' % name
  56.         data = {'message' : message}
  57.         return json.dumps(data)
  58.     
  59.     
  60. if __name__ == '__main__':
  61.     
  62.     server_address = ('0.0.0.0', 8000)
  63.     httpd = BaseHTTPServer.HTTPServer(server_address, MyHandler)
  64.     print('Serving HTTP on 0.0.0.0 port %d ...' % server_address[1])
  65.     print('use <Ctrl-(C or break)> to stop')
  66.     httpd.serve_forever()
  67.     





$ python view.py

と実行して、http://localhost:8000にアクセスします。

731_02.png


適当な文字列を入力してボタンをクリックすると、応答が得られました。

731_03.png


なんとかPython単独でwebアプリケーションが作成できそうです。



【参考URL】

SimpleHTTPServer — 簡潔な HTTP リクエストハンドラ
BaseHTTPServer – web サーバを実装するベースクラス
関連記事

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

  1. 2017/01/30(月) 23:53:09|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ