ASi このページをアンテナに追加 RSSフィード

2017/12/08 Friday

Slack にポストされるメッセージを Zapier で email に転送する

これ自体は Zapier だけで実現できるのだが、如何せん Zapier の無料枠が少なすぎて只とは行かない。


しかし、slack ってなんでそう流行ってるのかね。mailer と slack と両方見ないといけなくて、単純に無駄に時間を費やすんだけど。おまけに重いし。

2017/12/06 Wednesday

[]Simple Email Service (SES)

Simple Email Service (SES) のページで Identity Management / Email Adresses

に送り元(from) に使うアドレスを登録する必要がある。登録依頼するとそのアドレスに確認URLが送られて来、踏むと登録される。


IAM Policy に下記権限が要る。

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "ses:SendRawEmail",
               "ses:SendEmail"
           ],
           "Resource": "*"
       }
   ]
}

コマンドラインだと簡単にはこれで送れる。

aws --region us-west-2 ses send-email --from someonefrom@somewhere.com --to someoneto@somewhere.com --subject "test title" --text "test"

2017/12/03 Sunday

りゅうせーいがー きらーりー とんでいるー

随分前からこの歌が頭でグルグル回るんだけど、なんの曲だろう。

スプーンおばさんと関係がありそうなんだけどなぁ

>>

昨日までのおしゃべりが どうしてなのか わんだーらん りゅうせーいがー きらーりー とんでいるー

<<


2017/11/29 Wednesday

日立のドラム洗濯機 BD−SV100AL

8月頭に15万でゲット。

半月経ったら練馬の電気屋で14万台だったなー


順調によく乾き働いている。

2017/11/27 Monday

[]コマンドラインからチェック

conf の文法確認

httpd -t -D DUMP_VHOSTS


conf の設定内容の一部表示

httpd -S


ロードされているmoduleのリスト

httpd -M

[]apache で VirtualHost

sudo vi /etc/apache2/httpd.conf

して下記のコメントアウトを外す

#LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so

どこかの conf に下記のように書く

Listen 60080

<VirtualHost *:60080>
  ProxyPass /somewhere/ http://www.somewhere.com
</VirtualHost>

[]VirtualHost と Location の関係

Location を VirtualHost の中に書けば、その内容は該当の VirtualHost にだけ効く。

Listen 60080

<VirtualHost *:60080>
  ProxyPass /somewhere/ http://www.somewhere.co.jp
  <Location /somewhere/>
    AuthType       Basic
    AuthName       "OSXLogin"
    AuthUserFile   /etc/apache2/users/passwords
    Require        valid-user
  </Location>
</VirtualHost>

これを例えば下記のようにしていると、

Listen 60080

<VirtualHost *:60080>
  ProxyPass /somewhere/ http://www.somewhere.co.jp
</VirtualHost>

<Location /somewhere/>
    AuthType       Basic
    AuthName       "OSXLogin"
    AuthUserFile   /etc/apache2/users/passwords
    Require        valid-user
</Location>

port 80 でも 60080 でも somewhere に Basic auth が掛かる。しかし、ProxyPass は 60080 にしか設定していないので、auth に通過した後で NotFound になる。


仮に 80 を public、60080 を private のような使い分けをする場合に、public の 80 の Basic auth が攻撃の糸口にならないとも限らないので、注意が必要。

2017/11/17 Friday

[]CLI での RDS MySQLインスタンスの作り方

DB の ParameterGroup はあらかじめ作っておく。下記では "DBParameterGroupName": "db-1"

の db-1。

create-db-instance.json

{
    "DBName": "ADatabase", 
    "DBInstanceIdentifier": "db-1", 
    "AllocatedStorage": 5, 
    "DBInstanceClass": "db.t2.micro", 
    "Engine": "mysql", 
    "MasterUsername": "root", 
    "MasterUserPassword": "1234567890", 
    "VpcSecurityGroupIds": [
        "sg-12345678",
    ], 
    "AvailabilityZone": "us-west-1a", 
    "DBSubnetGroupName": "main-subnet", 
    "PreferredMaintenanceWindow": "tue:01:00-tue:02:00", 
    "DBParameterGroupName": "db-1", 
    "BackupRetentionPeriod": 7, 
    "PreferredBackupWindow": "19:00-20:00", 
    "Port": 3306, 
    "MultiAZ": false, 
    "EngineVersion": "5.7.17", 
    "AutoMinorVersionUpgrade": true, 
    "LicenseModel": "general-public-license", 
    "OptionGroupName": "default:mysql-5-7", 
    "PubliclyAccessible": false, 
    "Tags": [
        {"Key": "owner", "Value": "someone"},
        {"Key": "workload-type", "Value": "development"}
    ], 
    "StorageType": "gp2", 
    "StorageEncrypted": false, 
    "CopyTagsToSnapshot": false, 
    "EnableIAMDatabaseAuthentication": false
}

$ aws --profile someone rds create-db-instance --cli-input-json file://`pwd`/create-db-instance.json


なぜか OSX では "file://" が要る。

成功すると下記の様な出力が得られる。

{
    "DBInstance": {
        "PubliclyAccessible": false, 
        "MasterUsername": "root", 
        "MonitoringInterval": 0, 
        "LicenseModel": "general-public-license", 
        "VpcSecurityGroups": [
            {
                "Status": "active", 
                "VpcSecurityGroupId": "sg-12345678"
            }
        ], 
        "CopyTagsToSnapshot": false, 
        "OptionGroupMemberships": [
            {
                "Status": "in-sync", 
                "OptionGroupName": "default:mysql-5-7"
            }
        ], 
        "PendingModifiedValues": {
            "MasterUserPassword": "****"
        }, 
        "Engine": "mysql", 
        "MultiAZ": false, 
        "DBSecurityGroups": [], 
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "db-1", 
                "ParameterApplyStatus": "in-sync"
            }
        ], 
        "AutoMinorVersionUpgrade": true, 
        "PreferredBackupWindow": "19:00-20:00", 
        "DBSubnetGroup": {
            "Subnets": [
                {
                    "SubnetStatus": "Active", 
                    "SubnetIdentifier": "subnet-12345678", 
                    "SubnetAvailabilityZone": {
                        "Name": "us-west-1a"
                    }
                }
            ], 
            "DBSubnetGroupName": "main-subnet", 
            "VpcId": "vpc-12345678", 
            "DBSubnetGroupDescription": "Main subnet", 
            "SubnetGroupStatus": "Complete"
        }, 
        "ReadReplicaDBInstanceIdentifiers": [], 
        "AllocatedStorage": 5, 
        "DBInstanceArn": "arn:aws:rds:us-west-1:111122223333:db:db-1", 
        "BackupRetentionPeriod": 7, 
        "DBName": "ADatabase", 
        "PreferredMaintenanceWindow": "tue:01:00-tue:02:00", 
        "DBInstanceStatus": "creating", 
        "IAMDatabaseAuthenticationEnabled": false, 
        "EngineVersion": "5.7.17", 
        "AvailabilityZone": "us-west-1a", 
        "DomainMemberships": [], 
        "StorageType": "gp2", 
        "DbiResourceId": "db-XXXXXXXXXXXXXXXXXXXXXXXXXX", 
        "CACertificateIdentifier": "rds-ca-2015", 
        "StorageEncrypted": false, 
        "DBInstanceClass": "db.t2.micro", 
        "DbInstancePort": 0, 
        "DBInstanceIdentifier": "db-1"
    }
}

2017/11/04 Saturday

[]ブレーキパッド調達

ぼちぼちなので。

以前156TSで使ってみてなんの問題も無いのでDixcel。

yahoo で Premium タイプ F 2513092 / R 2551685 を送税込\19,872


Dixcel のサイト

http://www.dixcel.co.jp/sx/e36.php?enode=11381011113110111111011-111-131-100-&ts=sports&qry=ALFAROMEO%20GT%20#n0111

2017/11/01 Wednesday

[]mysql_upgrade

DB performance_schema の Table session_variables が無いと言って MySQLWorkbench

が接続拒否られるので調べてみて、DB の更新が必要らしいことがわかった。

sudo mysql_upgrade -u root -p

sudo service mysqld restart

これで治った。

2017/10/30 Monday

[]サンバイザー調達

購入時から右側助手席のサンバイザーの付け根が折れており、差し込みの締め込み圧だけで止まっており、時々グッと差し込んでやらないと外れる状態なので、いい加減調達することにした。

もっと早くしていればGT向けに鏡が大きくなったものを見つけられたかもしれないが、諦めて147のものを買うことにした。型番は一致するのでつけられるはず。

ebayイギリス業者から送税込 £28.99 \4442 paypal

多分船便で12月着


現車についていた型番は B288 937 DX 2 (2 DX かも知れず)

f:id:ashura156:20171001155109j:image

f:id:ashura156:20171001154933j:image

2017/10/28 Saturday

[]舵角一杯で右折すると左前輪からカランがらんと

音がする。6月にオイル交換してからな気がする。その時にタイヤも外しているが、何の音なのか…

2017/10/10 Tuesday

2017/09/27 Wednesday

[]CLIOSXへのインストール

下記に説明がある。

http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

install pip

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1558k  100 1558k    0     0  2371k      0 --:--:-- --:--:-- --:--:-- 2371k

$ sudo python get-pip.py
Password:
The directory '/Users/someone/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/someone/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 1.1MB/s 
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
    100% |████████████████████████████████| 51kB 9.3MB/s 
Installing collected packages: pip, wheel
Successfully installed pip-9.0.1 wheel-0.30.0


install awscli

Amazaon の説明通りではエラーになった。同件↓

https://saku.io/failed-to-install-awscli-on-mac/

$ sudo pip install awscli
The directory '/Users/someone/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/someone/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting awscli
  Downloading awscli-1.11.156-py2.py3-none-any.whl (1.2MB)
    100% |████████████████████████████████| 1.2MB 1.2MB/s 
Collecting PyYAML<=3.12,>=3.10 (from awscli)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 4.6MB/s 
Collecting rsa<=3.5.0,>=3.1.2 (from awscli)
  Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB)
    100% |████████████████████████████████| 51kB 10.7MB/s 
Collecting docutils>=0.10 (from awscli)
  Downloading docutils-0.14-py2-none-any.whl (543kB)
    100% |████████████████████████████████| 552kB 2.5MB/s 
Collecting botocore==1.7.14 (from awscli)
  Downloading botocore-1.7.14-py2.py3-none-any.whl (3.7MB)
    100% |████████████████████████████████| 3.7MB 358kB/s 
Collecting s3transfer<0.2.0,>=0.1.9 (from awscli)
  Downloading s3transfer-0.1.11-py2.py3-none-any.whl (54kB)
    100% |████████████████████████████████| 61kB 11.4MB/s 
Collecting colorama<=0.3.7,>=0.2.5 (from awscli)
  Downloading colorama-0.3.7-py2.py3-none-any.whl
Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli)
  Downloading pyasn1-0.3.6-py2.py3-none-any.whl (63kB)
    100% |████████████████████████████████| 71kB 11.2MB/s 
Collecting jmespath<1.0.0,>=0.7.1 (from botocore==1.7.14->awscli)
  Downloading jmespath-0.9.3-py2.py3-none-any.whl
Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.7.14->awscli)
  Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
    100% |████████████████████████████████| 194kB 6.0MB/s 
Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.9->awscli)
  Downloading futures-3.1.1-py2-none-any.whl
Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore==1.7.14->awscli)
  Downloading six-1.11.0-py2.py3-none-any.whl
Installing collected packages: PyYAML, pyasn1, rsa, docutils, jmespath, six, python-dateutil, botocore, futures, s3transfer, colorama, awscli
  Running setup.py install for PyYAML ... done
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 778, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-7JcVq_-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'


下記で前掲のページの解決策に従い成功。pip への指示が違う。

$ sudo -H pip install awscli --upgrade --ignore-installed six
Password:
Collecting awscli
  Using cached awscli-1.11.156-py2.py3-none-any.whl
Collecting six
  Using cached six-1.11.0-py2.py3-none-any.whl
Collecting PyYAML<=3.12,>=3.10 (from awscli)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 3.7MB/s 
Collecting rsa<=3.5.0,>=3.1.2 (from awscli)
  Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB)
    100% |████████████████████████████████| 51kB 7.4MB/s 
Collecting docutils>=0.10 (from awscli)
  Downloading docutils-0.14-py2-none-any.whl (543kB)
    100% |████████████████████████████████| 552kB 2.2MB/s 
Collecting botocore==1.7.14 (from awscli)
  Using cached botocore-1.7.14-py2.py3-none-any.whl
Collecting s3transfer<0.2.0,>=0.1.9 (from awscli)
  Using cached s3transfer-0.1.11-py2.py3-none-any.whl
Collecting colorama<=0.3.7,>=0.2.5 (from awscli)
  Using cached colorama-0.3.7-py2.py3-none-any.whl
Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli)
  Downloading pyasn1-0.3.6-py2.py3-none-any.whl (63kB)
    100% |████████████████████████████████| 71kB 9.6MB/s 
Collecting jmespath<1.0.0,>=0.7.1 (from botocore==1.7.14->awscli)
  Downloading jmespath-0.9.3-py2.py3-none-any.whl
Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.7.14->awscli)
  Using cached python_dateutil-2.6.1-py2.py3-none-any.whl
Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.9->awscli)
  Using cached futures-3.1.1-py2-none-any.whl
Building wheels for collected packages: PyYAML
  Running setup.py bdist_wheel for PyYAML ... done
  Stored in directory: /var/root/Library/Caches/pip/wheels/2c/f7/79/13f3a12cd723892437c0cfbde1230ab4d82947ff7b3839a4fc
Successfully built PyYAML
Installing collected packages: PyYAML, pyasn1, rsa, docutils, jmespath, six, python-dateutil, botocore, futures, s3transfer, colorama, awscli
Successfully installed PyYAML-3.12 awscli-1.11.156 botocore-1.7.14 colorama-0.3.7 docutils-0.14 futures-3.1.1 jmespath-0.9.3 pyasn1-0.3.6 python-dateutil-2.6.1 rsa-3.4.2 s3transfer-0.1.11 six-1.11.0

[]EC2を止める時の挙動

sudo shutdown -H 0 では stopped になる。再起動可能。

はっきりしないが powered off にすると terminated になり、再起動不能。しばらくのち削除される。

2017/09/26 Tuesday

[]CodeDeploy の lifecycle event hook の ValidateService と AfterAllowTraffic

下記記事参考になったのだが、

http://dev.classmethod.jp/cloud/aws/rolling-update-when-codedeploy-using-elb-health-check/


ValidateService で行うと該当の instance の ELB への登録に進まず、デッドロックしてタイムアウトする。


同じことを AfterAllowTraffic で行えば意図通りの動作になったように思われる。


と言うより、


BeforeAllowTraffic ~ AllowTraffic ~ AfterAllowTraffic の間で ELB に繋いだ instance が InService になるのを待つ処理をしているようだ。Deployの詳細画面でインスタンスアクティビティを見ると AllowTraffic にかかる時間が InService の判定時間に一致している。


従って、lifecycle event hook で InService を待つ必要は無い、と言うことになる。

2017/09/14 Thursday

[]htdigest が生成するもの

https://httpd.apache.org/docs/2.4/misc/password_encryptions.html#digest に公式のドキュメントがある。


下記を生成している

username + ':' + realm + ':' + LOWERCASE(HEXSTR(MD5(username + ':' + realm + ':' + password)))


$ htdigest -c digestpasswords ARealm test

Adding password for test in realm ARealm.

New password: 111

Re-type new password: 111

$ cat digestpasswords

test:ARealm:8ec6c6ae886c1fc52efe07f0071c9f88


String realm = "ARealm";
String username = "test";
String password = "111";

MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] digest = md5.digest(
    (username + ':' + realm + ':' + password).getBytes());
System.out.println(
    DatatypeConverter.printHexBinary(digest).toLowerCase());

実行すると 
8ec6c6ae886c1fc52efe07f0071c9f88
が出力される。

2017/09/11 Monday

[]keep ssh tunnel active if it was terminated

shell script で実現できる。sshに限らず他のコマンドでも可能。

下記の script を chkconfig で登録した script の start などから <command> & でバックグラウンド呼び出しすれば良い。(ref http://d.hatena.ne.jp/ashura156/20170911/1505114755)

(ssh以外のコマンドの場合確認する exit code を修正する必要があるかもしれない)

#!/bin/sh

alive=true

function term(){
    echo
    echo singal trapped.
    alive=false

    for id in ${children[@]}; do
        kill $id;
        echo child $id killed
    done
}

trap 'term' 2 3 15

while true ; do
    ssh -N -L 10080:REMOTE_SERVER:80 -i ~/.ssh/key USER@TUNNELL_SERVER &
    
    children[$!]=$!
    wait $!
    estatus=$?
    echo child terminated with exit status $estatus
    unset children[$!]
    
    if test $estatus -eq 137 ;then    # killed by 9
        echo exit the loop
        break
        
# 子プロセスとして起動した場合は 2,3 では終わらない (上の空行必要)
#    elif test $estatus -eq 255 ;then  # killed by 2, 3
#        echo exit the loop
#        break
    fi

    if [ "$alive" != "true" ] ;then
        break
    fi
    echo rerun ssh
done

echo $(basename $0) end

[]Daemon / Service 追加

vi /etc/init.d/my_service

#!/bin.sh
# chkconfig: 2345 85 15
# description: my service

case "$1" in
  start)
        echo "Start"
        ;;
  stop)
        echo "Stop"
        ;;
  *)
        echo $"Usage: {start|stop|restart}"
esac

実行権付与

chmod 755 /etc/init.d/my_service


service に追加

chkconfig --add my_service


service を有効化

chkconfig my_service on


有効化時に

env: /etc/init.d/my_service: No such file or directory

と言われる場合、スクリプトの文法エラーや実行権を疑う。


実際のところどう設定されるかというと、

ls -la /etc/rc.d/rc2.d/ を見ると

lrwxrwxrwx 1 root root 14 Jul 5 08:20 S85my_service -> ../init.d/my_service

というようにリンクが作成されており、rc2.d の 2 がスクリプトの # chkconfig: 2345 の 2 と言うこと。


参考

http://kazmax.zpp.jp/linux_beginner/self-made_service_chkconfig.html

2017/09/10 Sunday

[]563399

2011/11/07 186095

2011/12/18 194523

2012/01/22 202069

2012/03/03 211920

2012/11/21 267002

2012/12/15 272241

2013/01/16 277943

2013/04/14 292287

2013/06/23 304255

2013/07/14 307741

2013/10/05 325664

2013/12/23 345326

2014/02/17 357676

2014/11/08 404697

2015/03/07 423100

2015/09/13 459364

2017/07/01 551955

2017/09/11 563399

[]apacheWindows Domain login を使う (Kerberos)

mod_auth_kerb を使う

http://modauthkerb.sourceforge.net/configure.html


Amazon Linux の場合 apache 2.2 と 2.4 で yum の名前が違う。

2.4 の場合 mod24_auth_kerb.x86_64 と 24 が付いている。


特定の apache でホストする URL へのアクセス時に id/pass の入力を要求するだけなら、下記の設定で動作する。


/etc/krb5.conf

[realms]
A_DOMAIN.COM = {
 kdc = domain_controller_host_name_or_addr:88
 admin_server = domain_controller_host_name_or_addr:88
}

httpd/conf.modules.d/ 下に適当な *.conf を作り、

<Location /a_path>
    AuthType       Kerberos
    AuthName       "Login to A_DOMAIN.COM"
    KrbAuthRealms  A_DOMAIN.COM
    KrbVerifyKDC   Off
    Require        valid-user
</Location>

valid-user ではなく


Require user user1@A_DOMAIN.COM

Require user user2@A_DOMAIN.COM


を並べてユーザを制限もできる。


Location は実在する directory ではなく servlet でホストする path でも良い。




参考:

http://www.clip.gr.jp/~imai/PukiImaiWiki/index.php?Apache%2F%C7%A7%BE%DA%A4%CBActiveDirectory%A4%F2%BB%C8%A4%A6%CA%FD%CB%A1


下記あたりを参考にすると統合Windows認証もできるのかもしれない。

http://fummy-net.blogspot.jp/2014/05/samba4-activedirectory-apache-windows.html

http://software.fujitsu.com/jp/manual/manualfiles/M100003/B1WN9401/05Z201/ssoaf/sso00273.htm#winautappli_deploy

2017/08/27 Sunday

[]OSXSymantec Endpoint Protection の一時的無効化方法

Daemonroot がオーナーなので sudo

sudo launchctl unload /Library/LaunchDaemons/com.symantec.symdaemon.plist

sudo launchctl unload /Library/LaunchDaemons/com.symantec.sharedsettings.plist

sudo launchctl unload /Library/LaunchDaemons/com.symantec.liveupdate.daemon.plist

sudo launchctl unload /Library/LaunchDaemons/com.symantec.liveupdate.daemon.ondemand.plist

SymUiAgent はログオンユーザーがオーナーなので sudo は付けない

launchctl unload /Library/LaunchAgents/com.symantec.uiagent.application.plist

2017/08/22 Tuesday

[] の PESSIMISTIC_READ

http://k-webs.jp/javaindex/post-1881# の記事、OPTIMISTIC lock の説明は分かり易く良いのだが、PESSIMISTIC_READ の説明が間違っている。

DBMS の read lock は他の transaction による書き込みを待たせるロックであって、読み込みは妨げない。

JPAJavadoc にも下記とある

LockModeType.PESSIMISTIC_READ can be used to query data using repeatable-read semantics without the need to reread the data at the end of the transaction to obtain a lock, and without blocking other transactions reading the data.

read lock は、ある transaction が完了するまでは、lock対象のレコードへの他の書き込みが発生しては困る場合に使う。

組み方にも依るが、割とよく使う lock である。

対して write lock は mutex のようなもので、完全に I/O を serialize してしまうので、安全だがパフォーマンスに悪影響が出る。

2017/08/16 Wednesday

[]OSXEclipse Oxygen で SubversiveSubclipse も動かん

いやはや

2017/08/05 Saturday

ひまわりがアワダチソウグンバイで全滅

うーん難しい

咲いたのにねぇ


下記には葉裏にとあるが、余裕で葉表にうじゃうじゃいた

http://www.sc-engei.co.jp/resolution/pestanddisease/photolist/details/1219.html


薬で対抗するしかなさそう

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1092313255


なんと2000年に日本で初めて見られる様になった外来種らしい

http://blog.goo.ne.jp/npo-biolife_2011/e/a1997d0a3f7a1b5b26c31fb435f7cbd2

2017/08/02 Wednesday

[]How to send multipart/form-data

仕様的には

https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

https://tools.ietf.org/html/rfc7578

https://www.ietf.org/rfc/rfc2047.txt

1つの field を1つの partとして含む bodyを送る。

ASCII外の文字を field の名前に使う場合は RFC2047 に従ってエンコードする必要がある。

巷には =?UTF-8?B? の B が小文字の例もあったりするが、正しくは大文字。実際 tomcat は小文字では受け付けない。

StringBuilder で扱っているが UTF-8 なので辻褄が合う。他の文字コードを使う場合は考慮が必要。

厳密には boundary が filed name/value と被らないよう検査も事前に必要。

tomcat8 では Content-Disposition に filename が有ると request parameter として扱わず getPart で取れるようになる。ファイルの送信ではこれを使う。逆を言うと filename を付けないと form のテキストフィールドの扱いになる。

    HttpURLConnection con = (HttpURLConnection) url.openConnection();

    String boundary = "---------------------------" + System.currentTimeMillis();
    con.setRequestProperty("Content-Type",
            "multipart/form-data; boundary=" + boundary);

    StringBuilder body = new StringBuilder();
    Encoder base64 = Base64.getMimeEncoder(); // java.util.Base64
    
    for(Map.Entry<String, String> entry : formData.entrySet()){
        body.append("--").append(boundary).append("\r\n")
        .append("Content-Disposition: form-data; name=\"=?UTF-8?B?")
            .append(base64.encodeToString(entry.getKey().getBytes(UTF_8))).append("?=\"\r\n")
        .append("Content-Type: text/plain; charset=UTF-8\r\n")
        .append("\r\n")
        .append(entry.getValue()).append("\r\n");
    }
    body.append("--").append(boundary).append("--\r\n");
    
    post(body.toString(), con);

2017/07/16 Sunday

2017/07/01 Saturday

[]551955

2011/11/07 186095

2011/12/18 194523

2012/01/22 202069

2012/03/03 211920

2012/11/21 267002

2012/12/15 272241

2013/01/16 277943

2013/04/14 292287

2013/06/23 304255

2013/07/14 307741

2013/10/05 325664

2013/12/23 345326

2014/02/17 357676

2014/11/08 404697

2015/03/07 423100

2015/09/13 459364

2017/07/01 551955

2017/06/30 Friday

[]alternative implementation of NSURL that can load from NSData(memory)

// Apple iOS Mac OSX Objective-C

// Copyright (c) 2017 ASi All Rights Reserved.

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ASiDataURL : NSURL

/** see initWithData method */
+ (instancetype) URLWithData:(NSData*)data path:(NSString*)path;

/**
 * @param path 
 *  e.g.) "/resource.ext" "/subpath/resource.ext". 
 *  It should be consist of valid characters as URL.
 *  path will be used to identify NSData passed so it should be unique if the 
 *  data has to be distinguished each other.
 */
- (instancetype) initWithData:(NSData*)data path:(NSString*)path
                                        NS_DESIGNATED_INITIALIZER;

@end

NS_ASSUME_NONNULL_END
// Copyright (c) 2017 ASi All Rights Reserved.

#import "ASiDataURL.h"


#define Scheme @"ASiData"

static NSMapTable<NSString*,ASiDataURL*>* asiDataURLInstances_;
static dispatch_semaphore_t sem_;


@interface ASiDataURLProtocol : NSURLProtocol
@end

@implementation ASiDataURL
{
    @package
    NSData* data_;
}
+ (void)initialize{
    if (self != [ASiDataURL self]){
        return;
    }
    asiDataURLInstances_ = [[NSMapTable alloc] 
                         initWithKeyOptions:NSMapTableStrongMemory 
                         valueOptions:NSMapTableWeakMemory capacity:1];
    sem_ = dispatch_semaphore_create(1);
    [NSURLProtocol registerClass:[ASiDataURLProtocol class]];
}

+ (instancetype) URLWithData:(NSData*)data path:(NSString*)path{
    return [[[ASiDataURL alloc] initWithData:data path:path] autorelease];
}

- (instancetype) initWithData:(NSData*)data path:(NSString*)path{
    
    if (path.length == 0){
        [NSException raise:NSInvalidArgumentException 
                    format:@"path shoudn't be 0 length or nil"];
    }
    if (data.length > NSIntegerMax){
        // Because the type of expectedContentLength is NSInteger in the method
        // NSURLResponse-initWithURL:MIMEType:expectedContentLength:textEncodingName:
        return nil;
    }
    
    NSMutableString* urlStr = [[NSMutableString alloc] initWithCapacity:
                               Scheme.length + 1 + path.length]; // +1 for ':'
    [urlStr appendString:Scheme@":"];
    [urlStr appendString:path];
    self = [super initWithString:urlStr relativeToURL:nil];
    [urlStr release];
    if (!self){
        return nil;
    }
    data_ = [data retain];
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    [asiDataURLInstances_ setObject:self forKey:self.path];
    dispatch_semaphore_signal(sem_);
    return self;
}

- (oneway void)release{
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    [super release];
    dispatch_semaphore_signal(sem_);
}

- (void)dealloc{
    [asiDataURLInstances_ removeObjectForKey:self.path];
    [data_ release];
    [super dealloc];
}

#define NOIMP \
    [NSException raise:NSGenericException format:@"%@:%@-%@", @"not supported", \
    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; \
    return [self initWithData:[NSData data] path:@""];
- (instancetype)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path{NOIMP}
- (instancetype)initFileURLWithFileSystemRepresentation:(const char *)path isDirectory:(BOOL)isDir relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (nullable instancetype)initWithString:(NSString *)URLString relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initWithDataRepresentation:(NSData *)data relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initAbsoluteURLWithDataRepresentation:(NSData *)data relativeToURL:(nullable NSURL *)baseURL{NOIMP}
#undef NOIMP

@end


#pragma mark -

@interface ASiDataURLProtocol ()
@end
@implementation ASiDataURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    NSString *scheme = [[request URL] scheme];
    return [Scheme isEqual:scheme];
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    
    id<NSURLProtocolClient> client = [self client];
    NSURLRequest* request = [self request];
    
    // The URL obtained from request is not a instance of ASiDataURL.
    // Therfore we lookup data in MapTable using a path.
    NSString* path = [request URL].path;

    NSURLResponse* response;
    NSData* data;
    
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    ASiDataURL* dataURL = [[asiDataURLInstances_ objectForKey:path] retain];
    if (!dataURL){
        dispatch_semaphore_signal(sem_);
        
        [client URLProtocol:self didFailWithError:
            [NSError errorWithDomain:NSURLErrorDomain
                code:NSURLErrorResourceUnavailable userInfo:nil]];
        return;
    }
    data = [dataURL->data_ retain];
    dispatch_semaphore_signal(sem_);

    response = [[NSURLResponse alloc] initWithURL:dataURL
                    MIMEType:@"application/octet-stream" 
                    expectedContentLength:(NSInteger)data.length 
                    textEncodingName:nil];
    
    [client URLProtocol:self didReceiveResponse:response
        cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    
    [client URLProtocol:self didLoadData:data];
    
    [client URLProtocolDidFinishLoading:self];
    
    [response release];
    [data release];
    [dataURL release];
}

- (void)stopLoading{
    // nop
}

@end

2017/06/29 Thursday

[] V6 3.2 エンジンオイル & フィルター交換

59906km

噂にたがわず大変だった

でもまあ慣れだねぇ


ついでに調べたらギアのドレンは10mm hex socket bolt だった。12も少し上部にあったがそれぞれギアとデフか? 多分10だけ開けると思うが、今は不明


f:id:ashura156:20170624130200j:image

ドレンプラグは19mm。意外と固く締まっておりロングストレートメガネで慎重に緩めた。アルミエンジンなので気を使う。

f:id:ashura156:20170624140508j:image

f:id:ashura156:20170624140528j:image

http://d.hatena.ne.jp/ashura156/20140627/p1 に書いた KTC のフィルタレンチが必須に思える。このレンチは 9.5sqのソケットレンチや24mmのメガネで回せるようになっている。ソケットを使うには高剛性ラチェットが要ると思うがあいにく持ち合わせていなかったため、メガネで作業した。メガネを掛け替えるのにもギリギリのスペースしかない。


縦長の写真の右下側画角一杯にLに曲がっている2連のパイプがエアコンだったか?のパイプらしく、

先がゴムパイプに繋がっているため少し遊びがあり、これをぎゅっとずらして取り出す。外すのも付けるのも知恵の輪状態で一苦労。

更にフィルタを外すとエンジンから結構オイルが排出されるので、フィルタステーの下側のパイプ類は避けようなくオイルまみれになる。予め廃油受けをそばに置いて潜らないと慌てる事に(慌てた)

f:id:ashura156:20170624142818j:image

マグネット付き。今回は綺麗なものだった。今回がこの車を自力で交換は初なので比較はできない。

f:id:ashura156:20170624162925j:image

2017/06/17 Saturday

[]alternative implementation of NSURL that can load from NSData(memory)

// Apple iOS Mac OSX Objective-C

// Copyright (c) 2017 ASi All Rights Reserved.

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ASiDataURL : NSURL

/** see initWithData method */
+ (instancetype) URLWithData:(NSData*)data path:(NSString*)path;

/**
 * @param path 
 *  e.g.) "/resource.ext" "/subpath/resource.ext". 
 *  It should be consist of valid characters as URL.
 *  path will be used to identify NSData passed so it should be unique if the 
 *  data has to be distinguished each other.
 */
- (instancetype) initWithData:(NSData*)data path:(NSString*)path
                                        NS_DESIGNATED_INITIALIZER;

@end

NS_ASSUME_NONNULL_END
// Copyright (c) 2017 ASi All Rights Reserved.

#import "ASiDataURL.h"


#define Scheme @"ASiData"

static NSMapTable<NSString*,ASiDataURL*>* asiDataURLInstances_;
static dispatch_semaphore_t sem_;


@interface ASiDataURLProtocol : NSURLProtocol
@end

@implementation ASiDataURL
{
    @package
    NSData* data_;
}
+ (void)initialize{
    if (self != [ASiDataURL self]){
        return;
    }
    asiDataURLInstances_ = [[NSMapTable alloc] 
                         initWithKeyOptions:NSMapTableStrongMemory 
                         valueOptions:NSMapTableWeakMemory capacity:1];
    sem_ = dispatch_semaphore_create(1);
    [NSURLProtocol registerClass:[ASiDataURLProtocol class]];
}

+ (instancetype) URLWithData:(NSData*)data path:(NSString*)path{
    return [[[ASiDataURL alloc] initWithData:data path:path] autorelease];
}

- (instancetype) initWithData:(NSData*)data path:(NSString*)path{
    
    if (path.length == 0){
        [NSException raise:NSInvalidArgumentException 
                    format:@"path shoudn't be 0 length or nil"];
    }
    if (data.length > NSIntegerMax){
        // Because the type of expectedContentLength is NSInteger in the method
        // NSURLResponse-initWithURL:MIMEType:expectedContentLength:textEncodingName:
        return nil;
    }
    
    NSMutableString* urlStr = [[NSMutableString alloc] initWithCapacity:
                               Scheme.length + 1 + path.length]; // +1 for ':'
    [urlStr appendString:Scheme@":"];
    [urlStr appendString:path];
    self = [super initWithString:urlStr relativeToURL:nil];
    [urlStr release];
    if (!self){
        return nil;
    }
    data_ = [data retain];
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    [asiDataURLInstances_ setObject:self forKey:self.path];
    dispatch_semaphore_signal(sem_);
    return self;
}

- (oneway void)release{
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    [super release];
    dispatch_semaphore_signal(sem_);
}

- (void)dealloc{
    [asiDataURLInstances_ removeObjectForKey:self.path];
    [data_ release];
    [super dealloc];
}

#define NOIMP \
    [NSException raise:NSGenericException format:@"%@:%@-%@", @"not supported", \
    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; \
    return [self initWithData:[NSData data] path:@""];
- (instancetype)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir{NOIMP}
- (instancetype)initFileURLWithPath:(NSString *)path{NOIMP}
- (instancetype)initFileURLWithFileSystemRepresentation:(const char *)path isDirectory:(BOOL)isDir relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (nullable instancetype)initWithString:(NSString *)URLString relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initWithDataRepresentation:(NSData *)data relativeToURL:(nullable NSURL *)baseURL{NOIMP}
- (instancetype)initAbsoluteURLWithDataRepresentation:(NSData *)data relativeToURL:(nullable NSURL *)baseURL{NOIMP}
#undef NOIMP

@end


#pragma mark -

@interface ASiDataURLProtocol ()
@end
@implementation ASiDataURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    NSString *scheme = [[request URL] scheme];
    return [Scheme isEqual:scheme];
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    
    id<NSURLProtocolClient> client = [self client];
    NSURLRequest* request = [self request];
    
    // The URL obtained from request is not a instance of ASiDataURL.
    // Therfore we lookup data in MapTable using a path.
    NSString* path = [request URL].path;

    NSURLResponse* response;
    NSData* data;
    
    dispatch_semaphore_wait(sem_, DISPATCH_TIME_FOREVER);
    ASiDataURL* dataURL = [[asiDataURLInstances_ objectForKey:path] retain];
    if (!dataURL){
        dispatch_semaphore_signal(sem_);
        
        [client URLProtocol:self didFailWithError:
            [NSError errorWithDomain:NSURLErrorDomain
                code:NSURLErrorResourceUnavailable userInfo:nil]];
        return;
    }
    data = [dataURL->data_ retain];
    dispatch_semaphore_signal(sem_);

    response = [[NSURLResponse alloc] initWithURL:dataURL
                    MIMEType:@"application/octet-stream" 
                    expectedContentLength:(NSInteger)data.length 
                    textEncodingName:nil];
    
    [client URLProtocol:self didReceiveResponse:response
        cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    
    [client URLProtocol:self didLoadData:data];
    
    [client URLProtocolDidFinishLoading:self];
    
    [response release];
    [data release];
    [dataURL release];
}

- (void)stopLoading{
    // nop
}

@end

2017/06/08 Thursday

[]cocoapods の pod setup とっても時間がかかる

フリーズしたのかと思った。5分以上かかったと思われる。

2017/06/06 Tuesday

[]エアコンのフィルター交換

買ってから交換していなかった。買ってから25000キロほど、約4年ぶりだ。59719km時点。

真っ黒だった。


交換は意外にも助手席(右側)の足元で行う。

足元のカバーを10mm位のヘックスナット3つ外して外し、その奥、上方、カーオーディオの裏といったらいい所に、フィルターと熱交換器の収まっているケースが有る。フィルターの側面にあたる所が蓋になっており、下側に抜き出す。これは小さめのヘックスナット3つで止まっている。

これが極めて作業のしにくい場所で、助手席足元に寝そべりながら潜って体を捻りながらなんとかアクセスする状態。


MANN のスペアフィルターには丁寧にも交換手順のペーパーが写真付きで入っていたが、これに書かれていたフィルターケースのナットサイズより大きかった。

試した所幸いE8のトルクスがなんとかはまり、回せた。1つは結構奥まった所にあるので、柄の長いツールが必要。


付いていたフィルターはValeoの物だった。社名を主張するでかいプラ部品が付いていた。空気抵抗にしかならんのに…




f:id:ashura156:20170507131312j:image

f:id:ashura156:20170507131732j:image

f:id:ashura156:20170507133812j:image

f:id:ashura156:20170507133757j:image

f:id:ashura156:20170507140425j:image

f:id:ashura156:20170507140654j:image

2017/05/09 Tuesday

[]でposix_spawn

できないかな、と思ったのだけれど、やっぱ塞がれていた。最後のposix_spawnpがエラーになる。同じコードがOSXでは動く。

	do {
		posix_spawn_file_actions_t actions;
		posix_spawnattr_t attrs;
		char *args[]={"date", NULL};
		
		int ret;
		ret = posix_spawn_file_actions_init(&actions);
		if (ret != 0){
			NSLog(@"posix_spawn_file_actions_init failed");
			break;
		}
		ret = posix_spawnattr_init(&attrs);
		if (ret != 0){
			NSLog(@"posix_spawnattr_init failed");
			break;
		}
		
		int pid;
		ret = posix_spawnp(&pid, "date", &actions, &attrs, args, NULL);
		if (ret != 0){
			NSLog(@"posix_spawnp failed");
			break;
		}
	} while(0);