クエリ内で取った値をクエリ内で使いまわしたい
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.10.8 FROM 句内のサブクエリー
公式に載ってたよ。
やりたかったのは参照された値が存在するかどうか、存在するなら別のテーブルで使用するというものです。
INSERT INTO table (name, type) SELECT "NAME", target_type FROM ( SELECT type as target_type <--ポイント FROM t2 WHERE 条件 ) AS t1 WHERE target_type != 0 AND target_type is not null AND NOT EXISTS ( SELECT type FROM table WHERE type = target_type );
自分のテーブルでも存在確認に使っているので計4箇所に登場し毎回selectする訳にもいかなくて最初ユーザー定義変数で入れようとしたが、SQL文の発行が上手く行かずに悩んでいて、INSERTに使う値がそもそもこちらで用意した値なのでFROMでダミーの値入れていたんですが、ここ何とか出来ないかなっとリファレンスをそっちの方面で調べてみたら出てきたんですよね…
MySQLでINSERTに条件を付ける
SQLiteに続いてMySQLでも同じ問題に…
というか近いことは載ってるんですがドンピシャが無い…と思ってたら探し方が悪かったんですよね。without で調べたら結構出てきたよ(うぅ英語力ぇ)
stackoverflow.com
ということで、したかった事はsqliteの時と同じでinsertで該当のレコードが存在するなら無視というものです。
比較するカラムがユニークでは無いためにignoreは使えずという条件。
INSERT INTO user_base (user_id, user_pass) SELECT ?, ? FROM (SELECT 1) AS dummy WHERE NOT EXISTS ( SELECT user_id FROM user_base WHERE user_pass = ? ) LIMIT 1;
FROMの後の(SELECT 1) AS dummyが重要。
テーブルと認識させているっぽいです。エイリアス無いとsyntax errorで怒られます。
MultipeerConnectivityのセキュリティ
https://www.blackhat.com/docs/us-14/materials/us-14-Diquet-It-Just-Networks-The-Truth-About-iOS-7s-Multipeer-Connectivity-Framework.pdf
MultipeerConnectivityを使ったアプリのアップデートの更新をしようとしたのですが…
initWithPeer:securityIdentity:encryptionPreferenceのencryptionPreferenceをデフォルトでMCEncryptionRequiredにした方が良さそうなんですかね?
Wiresharkでパケットの流れ見たんですけどよく分からん!
そもそもデータをNSDataにアカーイブしてから渡してるので正直詳しくないと分からん。
ただし上記のサイト見てみるとMCEncryptionRequiredを標準にした方が良いよとの事です。
securityIdentityが自前で証明書やら秘密鍵やらの項目なんですが、
forums.developer.apple.com
この辺りを見てるとやっぱりMCEncryptionRequiredで十分よーって言ってるんだが…
話は変わりますがこれを申請にだすと勿論暗号化技術を使ってる訳なので輸出コンプライアンスに引っかかるのかどうかって事です。
stackoverflow.com
まぁ面倒ですけど審査の時の質問の所に説明を求めることにしました…
ビルドしなおせば良いだけですからね。
PHPとフロントエンド
PHPとMySQLを使ったWEBアプリを作ろうと思い構造をかっこ良く言えばアーキテクチャを考えたんですが、PHPでフロントエンド作る必要ないなって…
何ページも必要なアプリを作るなら分かるが、1ページで済むアプリならAjax多用の方が通信的にお優しいですし流行りのUX的にも良いですしね。
ところで何作ろう(遠い目)
最後に触ったPHPのバージョンが5.4位で現在7.0ですね。
バージョンが5.9位から一気に7に飛んでるとしてもかなりの仕様が変更されていて正直本が欲しいです。
- 作者: 山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2016/04/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
ちなみに最後に触った時は名前空間が実装されてうんちゃらかんちゃーって時で、\を使う不思議な仕様に戸惑いましたが…
取り敢えずMySQLと軽量な何かを作るか
ということで当分pico-bit.infoはPHP関連の記事が増えるはず
実はswiftも、うに茶もcocos2d-xも触りたんだけどな
CALayerでお絵かきpart2
CALyerでお絵かきで来てくれる方が結構居ますがそんなに詳しい事書いていない上にretinaに対応していないというお粗末な解説なのでもうちょっと再利用出来る解説に…できるのか?
描画した内容をCALayerにする大まかな仕様、
- UIImageViewを用意し背景となるUIImageとCALayerで描いた内容を流し込むUIImageと背景のCALayerに設置するCALayerが必要となります。
- Retinaに対応する場合全てをRetina仕様にする必要があります。
- 画像のScale変更させるなら描き出した線のScaleも合わせる ※1
- 画像のサイズ変更出来る仕様の場合必ずUIImageViewのtransformでscaleを変更する ※2
※1 . 描画サイズはframe.sizeに対応するがCALayerはboundsに対応するため、描いた内容とCALayerに流し込む内容では大きさが異なります。
※2 . 画像をリサイズするとboundsの値が変更され色々と処理が増えるため
描画までのおおまかな流れです、
- まずはキャンバスとなるUIImageViewとUIImageを用意しますが、ここで必ず確認しないといけないのがUIImageのscaleです。もしRetinaなどに対応する場合必ず対応したものに書きなおして下さい。
パスで画像を取り込む場合scaleで[[UIScreen mainScreen] scale]などして値を取得
- (nullable UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale
- 次にCALayerに描画するので既に書き込まれたもしくはこれから書き込むCALayerをUIImageViewから取得してきます。ここで取ってくる値(objectAtIndex:)を変える仕様にするとレイアー構造に出来、数字が大きいほど前面に来ます。
CALayer *DummyLayer = [Canvas.layer.sublayers objectAtIndex:0];
DummyLayer.contentsScale = [[UIScreen mainScreen] scale];
- 毎回元画像を呼び出すのはコストが高いためCALayerを流し込む予備の画像をCALayerと元に作成します。新規作成してしまうと元の画像が残らないので必ずCALayerを画像にします。
UIImage *DummyImage = [[UIImage alloc]initWithCGImage:(CGImageRef)DummyLayer.contents scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];
ここまででtouchesBeganまでの流れです。
描画の大まかな流れです。
- touchesBeganでUIImageViewからCALayerを取得しそれを基にUIImageを作成します。その際は必ずscaleを設定しないとRetina仕様にはなりません。
- touchesMovedで、
UIGraphicsBeginImageContextWithOptions(Canvas.frame.size, NO,[[UIScreen mainScreen] scale]); [DummyImage drawAtPoint:CGPointZero]; [[UIColor blackColor] setStroke]; [path stroke]; //描画した画像をCALayerにセットします。 DummyLayer.contents = (id)[UIGraphicsGetImageFromCurrentImageContext() CGImage]; //取得してきた階層のレイヤーを新しいレイヤーに入れ替えます。 [Canvas.layer replaceSublayer:[Canvas.layer.sublayers objectAtIndex:0] with:DummyLayer];
- touchesEnded && touchesCancelled はtouchesMovedと大差ありません。
UIGraphicsBeginImageContextWithOptions(Canvas.frame.size, NO,[[UIScreen mainScreen] scale]); [DummyImage drawAtPoint:CGPointZero]; //画像のscaleが変更できる仕様でかつ線情報を保存溶かしたい場合だとここで一工夫 今から描画される線はframe基準ですがlayerに格納される線はbounds基準なので元に戻す必要があります。 UIBezierPath *bez = [UIBezierPath bezierPath]; [bez appendPath:self.bezierPath]; CGAffineTransform trans = CGAffineTransformMakeScale(1 / zoom,1 / zoom); //bezierPathをbounds基準の大きさに変更(元データとなります) [self.bezierPath applyTransform:trans]; [setColor setStroke]; //変更前の線はそのまま描画 [bez stroke]; DummyLayer.contents = (id)[UIGraphicsGetImageFromCurrentImageContext() CGImage]; [Canvas.layer replaceSublayer:[canvas.layer.sublayers objectAtIndex:0] with:DummyLayer];
大体の補足説明は以上ですが、流石にこのままだとtransformで変更した時に可哀想なことになるのでもう一説明です。
描く描画領域はframeでCALyerはboundsで決まると説明しましたよね?
なのでscaleを変えるともちろんCALayerの内容が見当違いの所に表示されます…
なので元データと記述したパスデータを使って、再描画してあげる必要があります。
なので私はUIBezierPathとパスの色、太さ等の値を持ったNSDictonaryデータが入った配列データを作成し、
再描画の時に利用しています。
for (NSDictionary *path in data) { @autoreleasepool{ UIGraphicsBeginImageContextWithOptions(Canvas.frame.size,NO,[[UIScreen mainScreen] scale]); //描画領域に、前回までに描画した画像を、描画します。 UIImage *old = [[UIImage alloc]initWithCGImage:(CGImageRef)newLayer.contents]; [oldImage drawAtPoint:CGPointZero]; UIBezierPath *bez = [UIBezierPath bezierPath]; [bez appendPath:path[@"line"]]; //[path[@"color"] setStroke]; //現在のキャンバスサイズに大きさを合わせてあげます。 CGAffineTransform trans = CGAffineTransformMakeScale(zoom,zoom); [bez applyTransform:trans]; [bez stroke]; newLayer.contents = (id)[UIGraphicsGetImageFromCurrentImageContext() CGImage]; // 描画を終了します。 UIGraphicsEndImageContext(); } } [Canvas.layer replaceSublayer:[Canvas.layer.sublayers objectAtIndex:0] with:newLayer];
Jenkinsが止まらない
Jenkinsがメモリ食うので止めたくて調べてみると…
launchAgentsにjenkinsなんて無いんだが?
動き続けてんだからDaemonが怪しくね?っと思いお隣のlaunchDaemons覗いたらちゃっかり居ました。
で調べたら、
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
アクティビティモニターからやっと消えてくれた。
再起動は
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
ちなみにversion1.642.4でのお話です。