2019年12月9日月曜日

GSuiteの「安全性の低いアプリへのアクセスを許可」を有効にする方法

設定箇所をなかなか見つけることができなかったので、メモ。

GsuiteではOAuthなどの最新のセキュリティ標準に対応していないサードパーティアプリからの接続をブロックする機能があります。
ただ、そういった場合でも使用したい場合もあります。



















その場合、アクセスを許可する必要があるのですが、
「ドメイン管理者にお問い合わせください」と表示され、設定箇所が見当たりません。
いろいろ調べていると、ヘルプにしっかりと記載がありました・・
まず、ドメイン単位で設定を許可し、その後ユーザー単位でも許可する必要があるようです。
https://support.google.com/a/answer/6260879?hl=ja

以下、設定方法になります。
1. Googleの管理コンソールで[セキュリティ] > [基本設定]にアクセス
2. [安全性の低いアプリ] にある [安全性の低いアプリの設定に移動] をクリック
3. [安全性の低いアプリの管理をユーザーに許可する]を選択し保存
4. ユーザー単位で[安全性の低いアプリの許可] をオンにする

サードパーティアプリもOAuthくらいには対応して欲しいところですね・・

2019年1月22日火曜日

AWS SESのsendRawEmailでスパム判定されてしまう件

sendRawEmailで添付ファイル付きのメールを送信したところ 以下のようなエラーで送信に失敗しました。 550-5.7.1 not RFC 5322 compliant: 550-5.7.1 'From' header is missing. 550-5.7.1 To reduce the amount of spam sent to Gmail, this message has been
$result = $SesClient->sendRawEmail([
        'Destinations' => [$to],
        'Source' => $from,
        'RawMessage' => [
            'Data' => base64_encode($message)
        ],
]);
このbase64_encodeがいけないようで外したところうまく動作しました。

2018年3月12日月曜日

SFTP専用ユーザーの作成

sftpで特定のディレクトリだけアクセス許可するユーザーの作成手順。 sshd_configに以下の行を追加。
Match User sftp_user
 PasswordAuthentication yes # パスワード認証を許可
 ChrootDirectory /home/sftp_user # sftp_userディレクトリをホームディレクトリにする
 ForceCommand internal-sftp # sftpコマンドに制限
さらにSFTPの接続を処理するサブシステムを、標準のsftp-serverからsshd内部のinternal-sftpに変更。
#Subsystem      sftp    /usr/local/libexec/sftp-server
Subsystem       sftp    internal-sftp
sshdを再起動。 ホームディレクトリはroot所有でrootのみread/writeのパーミッションが必要なため変更。
# chown root:root /home/sftp_user
# chmod 755 /home/sftp_user

2017年6月14日水曜日

Apache + OpenSSLでのCSR生成方法

Apache + OpenSSLでのCSR生成方法

①秘密鍵を生成する
openssl genrsa -des3 -out ./xxxxxx(ファイル名).key 2048
-des3:des3アルゴリズムのパスワードを保護する
パスフレーズを要求されるので忘れない
keyファイルが生成されます

②①で作成した秘密鍵ファイルからCSRを生成する
# openssl req -new -key ./xxxxxx(ファイル名).key -out ./xxxxx.csr

③証明書の署名要求が表示されるので諸々入力していく
# Country Name (2 letter code):JP(国コード)
# State or Province Name (full name) []:Tokyo(都道府県)
# Locality Name (eg, city) [Default City]:Shibuya(市区町村)
# Organization Name (eg, company) [Default Company Ltd]:会社・組織名
# Organizational Unit Name (eg, section) []:部署名
# Common Name (eg, your name or your server's hostname) []:認証を受けるホスト名
# Email Address []:
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
csrファイルが生成されます

2017年4月18日火曜日

header("Location:~")でページしない件

header("Location:~")で遷移しない。
header("Location:~")の前にhtmlがあると止まるそう。

<html><body>
<?php 
    header("Location: URL"); 
    exit(); 
?> 

こういうのはダメ。

2017年3月1日水曜日

今更ながらgitのお勉強(2) git pushで本番環境に自動デプロイさせる

ローカル環境で
git push origin master

本番環境で
git pull origin master

これが面倒なので、ローカルでgit pushさせたら本番でpushを検知して、自動でpullするようにする。

$ cd /home/gitrepo/○○.git/hook
$ vi post-receive
#!/bin/sh
cd /var/www/html/test
git --git-dir=.git pull
$ chmod a+x post-receive

これでローカルからgit pushすると本番に自動反映されるようになりました。

2017年2月27日月曜日

実行中のプロセスの調べ方

そもそもプロセスって何?・・・Linuxで動作中のプログラム。タスクとも呼ばれる。プロセスには親子関係があり、親プロセスが子プロセスを生む。

プロセスの確認
psコマンドで実行します。まずはオプションなしの単純なパターン

$ ps
PID TTY          TIME CMD
21750 pts/0    00:00:00 ps
30490 pts/0    00:00:00 bash

表示の意味
PID・・・プロセス番号
TTY・・・プロセスを実行している制御端末
TIME・・・CPUの消費時間
CMD・・・実行コマンド

すべてのプロセスを確認
$ ps a

すべてのプロセスをユーザーフォーマットで表示
$ ps au

制御端末のないものも含むすべてのプロセスをユーザーフォーマットで表示
$ ps aux

特定のプロセスを確認する(ここではhttpd)
$ ps aux | grep httpd
root      4250  0.0  0.1 413200 39388 ?        Ss   Feb26   0:55 /usr/sbin/httpd
nobody   23957 17.6  0.1 426296 45972 ?        R    17:23   0:01 /usr/sbin/httpd
nobody   23958  3.5  0.1 418328 37932 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23984 10.7  0.1 422560 41852 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23985  6.1  0.1 421728 41468 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23986  1.6  0.1 423500 41816 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23987  1.8  0.0      0     0 ?        Z    17:23   0:00 [httpd] <defunct>
nobody   23988  3.2  0.1 423456 42744 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23989  2.7  0.1 421540 41456 ?        S    17:23   0:00 /usr/sbin/httpd
nobody   23991 10.5  0.1 444792 63724 ?        S    17:23   0:00 /usr/sbin/httpd
500      24130  0.0  0.0 107456   940 pts/0    S+   17:23   0:00 grep httpd

STATのアルファベットの意味
R・・・稼働中
S・・・スリープ中
D・・・スリープ中(現在制御不可)
T・・・停止処理中、またはトレース中
Z・・・ゾンビ状態

以前起きたトラブル
nagiosからプロセス増加の警告
→ps aux | grep httpdでapacheのプロセスを確認
→スリープ状態のhttpdが大量にある

とりあえずは以下で対処できます
・killコマンドで個別にプロセスを消す
・apache再起動

2017年2月22日水曜日

setcookieした内容がリダイレクトで消える件

セットしたクッキーがリダイレクト後に消えてしまう
setcookie( "test", "value", time() + 1800 );
header("location:example.com");
デフォルトではカレントディレクトリが有効範囲らしいので
setcookie( "test", "value", time() + 1800, "/" );
としてドメイン配下をすべて有効にするとうまくクッキーが焼けました

2017年2月13日月曜日

今更ながらgitのお勉強(1) 基本のコマンド

よく使うgitの基本コマンドをまとめました。

git init
プロジェクトをgitで管理するときに使用する
git init

git add
新規追加された、更新されたファイルをaddする
git add . (カレントディレクトリ以下のファイルをすべてaddする)
git add -u (既にgit管理内にあるファイルのみで、変更があった部分のみをaddする)

git commit
addされたファイルをコミットする
git commit -a (変更のあったファイルをすべてコミット)
git commit -v (変更点を表示してコミット)
git commit -m (コメントを残してコミット)
git clone
既存のリポジトリからコピーしたいときに使う
git clone ○○○(http://~~, ssh://~~)

git pull
リポジトリの最新情報を取得し(fetch)現在の状態とマージ(merge)する
git pull origin master (originリポジトリのmasterブランチからpullする)

git push
リポジトリへ更新をプッシュする
git push origin master (originリポジトリのmasterブランチにpushする) 

2015年2月18日水曜日

メソッドのオーバーライド時のエラーを回避する

とあるメソッドをオーバーライドしたとき

Declaration of %s::%s() should be compatible with that of %s::%s()

というエラーが発生しました。

これは親クラスのメソッドと引数が異なるのが原因でした。
http://www.1x1.jp/blog/2007/11/php_e_strict_message.html

しかし
親クラス
public function getUserInfo( $a ){

子クラス
public function getUserInfo( $a, $b = NULL, $c = NULL ){

のようにデフォルト値を持つ引数は追加できるのでこの方法で回避できます。

2015年2月16日月曜日

Ajax通信のsuccess時に自身の関数に返す処理


successに自身の関数を呼び出せばいいようです。

//コールバック
function result_test_callback(result){

  $('#result_site_patrol_message_member').html(result);

  $('input:button[name=shuffle_message_member]').click(function(){

    if (confirm('再抽選を実行してよろしいですか?')) {

      if(xhr_shuffle){
        xhr_shuffle.abort();
      }

      xhr_shuffle = $.ajax({
        url  : url,
        type : "post",
        processData : false,
        data : post_data,
        dataType : "json",
        async : false,
        cache : false,
        success : result_test_callback ←これ 
            });

   }
 });

}

2014年10月29日水曜日

jQueryのunrecognized expressionについて

とあるファイルの操作で

Uncaught Error: Syntax error, unrecognized expression: 
input:hidden[name*=images[20141029_181853_4552483cf23a5f224d54e0aa79241a14]] 

というエラーが発生しました。
input:hidden[name*='images[20141029_181853_4552483cf23a5f224d54e0aa79241a14]']

のようにシングルクオテーションでくくれば直りました。
内側と外側の引用符(記号)が同じだとエラーになるようです。

つまり、

$('input[name='text']');

のようなパターンもダメ。

2014年8月22日金曜日

FlexモバイルプロジェクトでHTMLを表示する方法

前回まではFlush CCを使っていましたが、画面遷移とかスプラッシュ画面とかが面倒なのでFlash CCでの開発はやめて、FlashBuilderを使うことにしました。

今回はFlash上にHTMLを表示する方法について。

<mx:HTML>を使おうとするとエラー
→Flexモバイルでは使えない?
http://help.adobe.com/ja_JP/flex/mobileapps/WSf3db6597adcd110e19124fcb12ab3a1c319-8000.html#WS8b1c39bd7e9fc3643c4a6fa12a8ac8b916-8000

stageWebViewを使うとモバイルアプリケーション内でブラウジング機能を利用することができます。


<?xml version="1.0" encoding="utf-8"?>
<s:View 
xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
actionBarVisible="false" 
creationComplete="IframeHandler(event)" 
title="Map">

<fx:Script>
<![CDATA[
   //HTMLを読み込む
   protected function IframeHandler(event:FlexEvent):void
   {
    var webView:StageWebView = new StageWebView(); webView.viewPort = new Rectangle(0, 430, this.stage.stageWidth, this.stage.stageHeight);
webView.stage = this.stage;
    var htmlString:String = 
    "<!DOCTYPE HTML>" +
    "<html><body>" +
    "<p>てすとです</p>" +
    "</body></html>";
    webView.loadString(htmlString, "text/html");
   }
]]>
</fx:Script>
 (~中略~)
</s:View>

HTMLが表示されました。

2014年8月19日火曜日

ActionScript3.0とNode.jsでSocket通信をする

今回は、Node.jsとSocket通信でメッセージを送りたい場合のお話。

前回まではレイヤーに書いてましたが、今回はクラスにActionScriptを読み込みます。



















ソースは以下のとおり。

SocketEx.as

package
{
import flash.display.Sprite;
import flash.events.DataEvent;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.net.XMLSocket;

public class SocketEx extends Sprite
{
private var _xmlSocket:XMLSocket; //ソケット
 
 
// --------------------------------------
// コンストラクタ
// --------------------------------------
public function SocketEx()
{
// EVENTS
addEventListener(Event.ADDED_TO_STAGE, _onAddedToStage);
 
}
 
// --------------------------------------
// メソッド
// --------------------------------------
//ステージの追加とソケットの接続
private function _onAddedToStage(aEvent : Event):void
{

_xmlSocket = new XMLSocket("153.127.250.224", 3000);
 
// EVENTS
stage.removeEventListener(MouseEvent.CLICK,         _onAddedToStage);
//
_xmlSocket.addEventListener(Event.CONNECT,          _onConnected);
_xmlSocket.addEventListener(IOErrorEvent.IO_ERROR,  _onIOError);
 
}
//ソケットの接続
private function _onConnected(aEvent : Event):void
{
//  TRACE
trace("onConnect() aEvent: " + aEvent);
 
//  EVENTS
_xmlSocket.removeEventListener(Event.CONNECT,           _onConnected);
_xmlSocket.removeEventListener(IOErrorEvent.IO_ERROR,   _onIOError);
//
_xmlSocket.addEventListener(DataEvent.DATA,             _onDataReceived);
_xmlSocket.addEventListener(Event.CLOSE,                _onSocketClose);

button_send.addEventListener(MouseEvent.CLICK, _onMessageSend);
 
}
 
//ソケットの切断
private function _onSocketClose(aEvent : Event):void
{
//  TRACE
trace("_onSocketClose aEvent : " + aEvent);
 
//  EVENTS
_xmlSocket.removeEventListener(Event.CLOSE, _onSocketClose);
_xmlSocket.removeEventListener(DataEvent.DATA, _onDataReceived);
}

//送信ボタンが押されたときの処理
private function _onMessageSend(evt:MouseEvent):void
{
_xmlSocket.send(message_send.text);
}
 
//送信データの受信
private function _onDataReceived(aEvent : DataEvent):void
{
try {
 
//  Show the server data in text
message_receive.htmlText += (aEvent.data + "\n");
 
//scroll down to show latest line
message_receive.scrollV = message_receive.maxScrollV;
 
} catch (error : Error) {
//  TRACE
trace("_onDataReceived error:  " + error);
}
}
 
//接続エラー
private function _onIOError(aEvent : IOErrorEvent):void
{
//  TRACE
trace("_onIOError aEvent: " + aEvent);
 
//  EVENTS
_xmlSocket.removeEventListener(Event.CONNECT, _onConnected);
_xmlSocket.removeEventListener(IOErrorEvent.IO_ERROR, _onIOError);
stage.addEventListener(MouseEvent.CLICK, _onAddedToStage);
}
 
}
}


Node.jsが入っていることが前提としてサーバー側のソースが以下の通り

app.js

// --------------------------------------
// Imports
// --------------------------------------
var net = require('net');
var mySocket;

// --------------------------------------
// Construct The Socket
// --------------------------------------
// create the server and register event listeners
var server = net.createServer(function(socket) {
    mySocket = socket;
    mySocket.on("connect", onConnect);
    mySocket.on("data", onData);
});

// --------------------------------------
// Events
// --------------------------------------
/**
 * Handles the Event: <code>"connect"</code>.
 *
*/
function onConnect()
{
    console.log("Connected to Flash");
}

/**
 * Handles the Event: <code>"data"</code>.
 *
 * When flash sends us data, this method will handle it
 *
*/
function onData(d)
{
    if(d == "exit\0")
    {
        console.log("exit");
        mySocket.end();
        server.close();
    }
    else
    {
        console.log("From Flash = " + d);
        mySocket.write(d, 'utf8');
    }
}

// --------------------------------------
// Start the Socket
// --------------------------------------
server.listen(3000, "IPアドレス");


実行
























という具合で動きました。

2014年8月15日金曜日

ActionScript3.0で動画ストリーミングを再生する

今回はflv形式の動画を再生したいとします。
流れは次のようになります。

1.flvを読み込むためにNetConnectionクラスを使う必要があるためまずはNetConnectionオブジェクトを生成する


2.connection()メソッドにnullを引数に指定して、HTTP上またはローカル上のファイルと接続する

3.接続が完了したらデータを読み込むためのストリームを生成する

4.ビデオオブジェクトを生成してサイズなどを指定する

5.NetStreamクラスのplay()メソッドで動画ストリーミングの再生を開始する

以下がソースとなります。
import flash.display.*;
import flash.media.*;
import flash.net.*;
import flash.text.*;

//1.コネクションの生成
var connection:NetConnection;
connection = new NetConnection();

//2.ファイルとの接続を確立
connection.connect(null);

//3.ストリームの生成
var stream:NetStream = new NetStream(connection);

// 4.ビデオオブジェクトを作成する
var video_obj:Video = new Video();

// ステージの表示リストに登録する
addChild(video_obj);

// ビデオオブジェクトのサイズを変更する
video_obj.x = 20;
video_obj.y = 20;
video_obj.width  = 440;
video_obj.height = 350;
video_obj.attachNetStream(stream);

//5.動画ストリーミングの再生開始
stream.play("sample1.flv");



いい感じに表示されました。


2014年8月14日木曜日

ActionScript3.0で入力フォームを作る(2)

ボタンをクリックしたときに文字が送信されるようにしたいとします。

1.矩形などでボタンのイメージを作成する
2.右クリックしてシンボルに変換→種類「ボタン」を選択












3.インスタンス名をつける
























4.ActionScriptを記述
クリックされたときに出力されるようにします


import flash.events.MouseEvent;

//クリックイベント
button1.addEventListener(MouseEvent.CLICK,button1Listener);
function button1Listener(e:MouseEvent){
message_display.text = "出力:" + chat_message.text;
}


5.出力
クオリティーはともかく、表示されました。



ActionScript3.0で入力フォームを作る(1)

AS3とAirでAndroidアプリを作ることになったのですが、初心者すぎてまったく勝手がわかりません。
ということでまずは入力フォームを作ってみます。
AdobeFlashProfessionalCCを使用しています。

1.プロパティからテキストツールを選択する
2.インスタンス名を入力(ここではchat_messgeとしています)
3.テキストの種類をテキスト入力とする





























4.こんなかんじにドラッグ&ドロップでフォームを作る
  矩形ツールでフォームの周りを囲んでおくと入力フォームっぽい



























5.出力先のフォームを作成する
アンチエイリアスにデバイスフォントを使用を選択する

















6.ActionScriptを記述する
タイムラインからレイヤーを選択するかF9でアクションタブを立ち上げる

import flash.events.Event;

//テキスト入力フォーム
chat_message.text = "入力してね!";

//入力されたテキストを表示する
chat_message.addEventListener(Event.ENTER_FRAME,updateMessage)
function updateMessage(e:Event):void{
message_display.text = "出力:" + chat_message.text;
}

7.Ctrl + Enterで実行


























という具合になります。
Web開発とは勝手が違うのでなんか大変そうです。






2014年7月28日月曜日

vimを使っているとき急に入力が受け付けられなくなる件

保存しようとして
「Ctrl」 + 「S」をいつの間にか押していることが原因でした。
これを押すとターミナルへの出力がロックされてしまうそうです。

「Ctrl」 + 「Q」で解除できるので、焦らず解除しましょう。



2014年7月17日木曜日

動的に追加した値をjqueryで取得する方法

動的に追加した値を取得したい場合の処理について。
たとえば、「よしだ」をクリックしたときに入力フォームに引用したいとします。



こんな感じ





[NG]
動的に取得したものに関してはclick(fn)だと取得できません
//ユーザー名クリックで引用
$('.message_name').click(function () {
//
$('#message').val('>' + $(this).html() + 'さん');
});

[OK]
live(type,fn)を使うと取得できる
//ユーザー名クリックで引用
$('.message_name').live('click',function () {
//
$('#message').val('>' + $(this).html() + 'さん');
});

この関数で指定できるイベントは次のとおりです
click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup

2014年5月20日火曜日

JavaScript中にSmartyの変数を使う際のデリミタ設定

テンプレートファイルの中にJavascriptを書いていて、PHPの変数を使いたいとき
JavaScriptの「{ }」と被るため


{literal}
function hoge() {
{/literal}
 window.alert({$hogehoge});
{literal}
}
{/literal}

のように書かなくてはならず、ソースが見にくくなってしまいました。

Smarty.class.php
$smarty->left_delimiter = '<{';
$smarty->right_delimiter = '}>';

のようにデミリタを設定すると、

function hoge() {
 window.alert(<{$hogehoge}>);
}

のようにシンプルに書くことができます。