x-ite's diary

覚え書きです。想定読者は俺

APNs Certiticate Flow

何度やっても毎回手間取るので未来の俺へメモ。
PyAPNS使用時のCert(PEM)ファイル生成。

iOS Certificates (Production)を
https://developer.apple.com/からつくる

ダウンロードしたCertificateをダブルクリックしてキーチェーンへ登録。

キーチェーンへ登録済みのCertificateを証明書と秘密鍵を同時に書き出す。
別々でもいいが2つのファイルからそれぞれPEMファイルをつくることになるので前者が便利。

書き出すときにパスフレーズも設定できるが、設定した場合は(cert.pem|key.pem)ファイルつくるときに入力必要。

path=$1
dirname="${path%/*}/"
basename=${path##*/}
filename=${basename%.*}
extension=${basename##*.}

pemcertfile="${dirname}${filename}-cert.pem"
pemkeyfile="${dirname}${filename}-key.pem"
pemkeynoencfile="${dirname}${filename}-key-noenc.pem"
pemfile="${dirname}${filename}.pem"

echo "Crate cert"
openssl pkcs12 -clcerts -nokeys -out $pemcertfile -in $path

#Input import password if necessary

echo "Crate privatekey"
openssl pkcs12 -nocerts -out $pemkeyfile -in $path

#Input import password if necessary
#Input PEM password

echo "Write RSA key"
openssl rsa -out $pemkeynoencfile -in $pemkeyfile

#Input PEM password you input 

echo "Concat key and cert"
cat $pemcertfile $pemkeynoencfile > $pemfile

Car AI Calculate torque and steer with waypoints in C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class CarAI : MonoBehaviour {

    public Transform CarTransform;

    public WheelCollider WCFrontLeft;
    public WheelCollider WCFrontRight;
    public WheelCollider WCRearLeft;
    public WheelCollider WCRearRight;

    public float EnginePower = 50.0f;
    public float MaxSteerAngle = 20.0f;

    public List<Vector3> Waypoints;
    public int CurrentWaypointIndex = 0;

    void Update() {
       
       Vector3 waypoint = Waypoints[CurrentWaypointIndex];

       Vector3 relativeWaypointPosition = CarTransform.InverseTransformPoint(
            new Vector3(waypoint.x, 
                       CarTransform.position.y, 
                       waypoint.z )
        );
                                       
        float steerRatio = relativeWaypointPosition.x / relativeWaypointPosition.magnitude;
        float torqueRatio;
 
        if (Mathf.Abs(steerRatio) < 0.5f) {
            torqueRatio = relativeWaypointPosition.z / relativeWaypointPosition.magnitude - Mathf.Abs(steerRatio);
        } else {
            torqueRatio = 0.0f;
        }
        
        float motorTorque = EnginePower * torqueRatio;
        float steerAngle = MaxSteerAngle * steerRatio;

        WCFrontLeft.motorTorque  = WCFrontLeft.isGrounded ? motorTorque : 0.0f;
        WCFrontRight.motorTorque = WCFrontRight.isGrounded ? motorTorque : 0.0f;
        WCRearLeft.motorTorque   = WCRearLeft.isGrounded ? motorTorque : 0.0f;
        WCRearRight.motorTorque  = WCRearRight.isGrounded ? motorTorque : 0.0f;

        WCFrontLeft.steerAngle  = steerAngle;
        WCFrontRight.steerAngle = steerAngle;
    }
}

Unity Serialization

using UnityEngine;
using System;
using System.IO;
using System.Reflection; 
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class BinarySerializer {

  public static byte[] Serialize(object serializableObject) {
    MemoryStream memoryStream = new MemoryStream();
		try {
   	  IFormatter formatterEncode = new BinaryFormatter();
   	  formatterEncode.Binder = new VersionDeserializationBinder();
   	  formatterEncode.Serialize(memoryStream, serializableObject);   
       
			return memoryStream.ToArray();
		} catch (Exception e) {
   			Debug.LogError(e + "Exception caught in encoding");
		}
		
		return null;
	}
	
  public static string SerializeToBase64String(object serializableObject) {
		byte[] byteArray = Serialize(serializableObject);
		return System.Convert.ToBase64String(byteArray);	
	}
	
	public static object Deserialize(byte[] serializedBinary) {
    try {
      MemoryStream memoryStream = new MemoryStream(serializedBinary);
   	  IFormatter formatterDecode = new BinaryFormatter();
      formatterDecode.Binder = new VersionDeserializationBinder();
      memoryStream.Position = 0;
      
   	  return formatterDecode.Deserialize(memoryStream);
		} catch (Exception e) {
   			Debug.LogError(e + "Exception caught in Decoding");
		}
		return null;
	}
	
	public static object DeserializeFromBase64String(string serializedBase64String) {
		byte[] byteArray = System.Convert.FromBase64String(serializedBase64String);
		return Deserialize(byteArray);
	}
	
}
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;


public sealed class VersionDeserializationBinder : SerializationBinder {
   public override Type BindToType(string assemblyName, string typeName)    {    
       if (!string.IsNullOrEmpty(assemblyName) && !string.IsNullOrEmpty(typeName))  {    
 
         Type typeToDeserialize = null;
         assemblyName = Assembly.GetExecutingAssembly().FullName; 
 
         // The following line of code returns the type.             
         typeToDeserialize = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
         return typeToDeserialize;       
       }       
       return null; 
   }
}
using System.Runtime.Serialization;
using System.Security.Permissions;

[System.Serializable]
public class PositionEntity : ISerializable {
	public float positionX;
	public float positionY;
	public float positionZ;
	
	public PositionEntity() {
	}
	
	protected PositionEntity(SerializationInfo info, StreamingContext context)
    {
     	if (info == null) {
       		throw new System.ArgumentNullException("info");
		}
        positionX = (float)info.GetValue("PositionX", typeof(float));
        positionY = (float)info.GetValue("PositionY", typeof(float));
        positionZ = (float)info.GetValue("PositionZ", typeof(float));
    }


    [SecurityPermission(SecurityAction.LinkDemand,
            Flags = SecurityPermissionFlag.SerializationFormatter)]
    public virtual void GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
    	if (info == null) {
        	throw new System.ArgumentNullException("info");
		}
        info.AddValue("PositionX", positionX);
        info.AddValue("PositionY", positionY);
        info.AddValue("PositionZ", positionZ);
    }

}

IIS7.5 SSLv2が有効か確認

SSLv2には脆弱性があるので無効化した方がいい。
SSLv2が有効か確認。

( echo -e "GET / HTTP/1.0\n" ; sleep 2 ) | openssl s_client -connect $DOMAINorIPADDRESS:443  -ssl2
有効

New, SSLv2, Cipher is DES-CBC3-MD5

無効

write:errno=54


無効化

IIS7.5 Windows Server 2008 R2
C:\Users\Administrator>reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" /v "Enabled" /t "REG_DWORD" /d "0x0"

再起動