エンジニアリングにはほど遠い

iPhoneアプリとかサイトとかをつくっていくブログです。

Rubyのcaseを圧縮

whenの後の条件式のあとは改行しないとエラーになるのでどうしても行数が長くなる
(追記: when A then B でいけます。基本的な事だけど知らなかった・・)

case key
when :foo
  1
when :bar    
  2
else
  3
end

条件が文字列かシンボルであれば下の様に書いてみてる。

{ foo:    1,
  bar:    2
}[key] || 3

式を返すなら

a = { foo: ->{ 0 + 1 },
      bar: ->{ 1 + 1 }
}[key]
a ? a.call : 1 + 2

(訂正: {...}[key].call としていたがこれはhashがnilのとき落ちる)
逆に複雑に見える気も。
これは良くない・もっとこうした方がいい等あったら教えていただきたいです。

追記: when A then B で書けることを知った

case key
when :foo then 1
when :bar then 2
else           3
end

まあこれならこれでいいかなw

WindowsのSSL 3.0をコマンドで無効化 (SSL 3.0 POODLE対応)

マイクロソフト セキュリティ アドバイザリ 3009008Windowsの方のSSLを無効にする方法をコマンドプロンプトで書きました。 やってることはレジストリにファイルを一つ作成しているのみです。

無効の設定ファイルの作成

reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client" /t REG_DWORD /v Enabled /d 0

実行後、再起動で反映。(すでにファイルがあった場合は上書きの是非を聞かれます)

※ 実行する際は注意してください。
※ この回避策はシステムにインストールされているすべてのクライアント ソフトウェアの SSL 3.0 を無効にします。
※ この回避策を適用後は、このコンピューター上のクライアント アプリケーションは、SSL 3.0 のみをサポートするその他のサーバーとは通信することはできません。

戻したい場合(作成したファイルを消したい場合)

reg delete "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client\Enabled"

これでバッチファイル化して楽に設定できそうですね。
HKEY_LOCAL_MACHINEはHKLMと省略して書く事もできる。

参考: Windows TIPS:コマンドプロンプトでレジストリを操作する

ちなみに、32bit Windows OSから64bit Windows OSのレジストリを操作する際は注意が必要っぽいです。 /reg:64 というオプションを付ける必要があるとか。

Clojureで同一キーでhash-mapのリストを作ろうとしたらハマった

下のはいける。

user=> (map #(hash-map :key %) [1 2 3])
({:key 1} {:key 2} {:key 3})

でも、キーを引数化したら怒られる。

user=> (map #(hash-map %1 %2) :key [1 2 3])

IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword  clojure.lang.RT.seqFrom (RT.java:505)

うーむ、まだシーケンスの感じがいまいち分かってないです。 とりあえず、以前作った将棋盤をClojureScriptで再作成しようと思ってます。感覚が全然違うので難しい。

CocoaPodsエラー diff: /../Podfile.lock: No such file or directory

以下のようなエラー。

diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

Pods.debug.xcconfigとPods.release.xcconfigをファイル自体消去してからpod installで直った。

f:id:J_ogawa:20141023195332p:plain

消さずにpod installじゃ直らないなぁ。

Windowsでchromeを落としてインストールするバッチファイル

Windowsマシンの設定自動化についてちょこちょこ調べてます。Windowsマシンは仕事でしかほとんど触らないのでなかなか慣れない。。

管理者権限で実行したらchromeのダウンロードからインストールまでやるバッチを作ってみました。powershellwget的な事をやってます。(.batと.ps1はマシン外の空間にあり、同階層という想定)

install_chrome.bat

@echo off
cd /d %~dp0
copy download_chrome.ps1 c:%homepath%\Desktop
powershell Set-ExecutionPolicy RemoteSigned
powershell c:%homepath%\Desktop\download_chrome.ps1
powershell Set-ExecutionPolicy Restricted
msiexec /i c:%homepath%\Desktop\chrome.msi /passive

line2: cd /d %~dp0 カレントディレクトリをバッチファイルの場所にする。
line3: 一旦ps1ファイルをローカルに持ってこないと動かなかったので。
line7: msiexecコマンドでmsiファイルからインストールできる。 /passiveで操作無し(インジケータとかのみ表示)

download_chrome.ps1

$clnt = new-object System.Net.WebClient
$url = "https://dl.google.com/dl/chrome/install/googlechromestandaloneenterprise64.msi"
$file = "$home\Desktop\chrome.msi"
$clnt.DownloadFile($url, $file)

powershell3.0より前のバージョンだとInvoke-WebRequestというものが無いらしいので記述したやり方で。windows7ではpowershell2.0が標準らしい

UITextFieldで編集中に別のやつにフォーカスさせると色がヘンになる

画面上にUITextFieldが複数あって何文字入力したら次のfieldにジャンプする、みたいな事をしたい場合このようにした。

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [_first addTarget:self
                   action:@selector(textFieldDidChange:)
         forControlEvents:UIControlEventEditingChanged];
    [_second addTarget:self
                    action:@selector(textFieldDidChange:)
          forControlEvents:UIControlEventEditingChanged];
}

- (void)textFieldDidChange:(id)sender
{
    if (sender == _first) {
        [_second becomeFirstResponder];
    }
}

でもこれだとジャンプ後のfieldでヘンな色がついてしまう。

f:id:J_ogawa:20140821192344p:plain

そこで、ジャンプ後のfieldで文字入力後にフォーカスを外してから付けるという風に書いてみた。

- (void)textFieldDidChange:(id)sender
{
    if (sender == _first) {
        [_second becomeFirstResponder];
    } else if (sender == _second) {
        [_second resignFirstResponder];
        [_second becomeFirstResponder];
    }
}

f:id:J_ogawa:20140821192500p:plain

これなら色がつかない。(ちゃんと分かっていない)

Ruby Hashのkeyをsymbolに変換する

hashの中のarrayの中にもhashがあったときの事を考えて書きました。

config/initializers/hash.rb

class Hash
  def keys_to_sym
    each_with_object({}) do |(k, v), hash|
      hash[k.to_sym] = v.respond_to?(:keys_to_sym) ? v.keys_to_sym : v
    end
  end
end

config/initializers/array.rb

class Array
  def keys_to_sym
    map{|v| v.respond_to?(:keys_to_sym) ? v.keys_to_sym : v }
  end
end

pryで実行

[1] pry(main)> [:s, {"ddd" => :ddd}, {fff: {"sda" => "sds"}}]
=> [:s, {"ddd"=>:ddd}, {:fff=>{"sda"=>"sds"}}]
[2] pry(main)> [:s, {"ddd" => :ddd}, {fff: {"sda" => "sds"}}].keys_to_sym
=> [:s, {:ddd=>:ddd}, {:fff=>{:sda=>"sds"}}]

Railsで使用。こうやって拡張するのがやりやすくていいですね。iOSでいうところのカテゴリ+.pchでのインポートみたいな感じですね。

2015/6/16 追記
deep_symbolize_keysはhash中のarray中のhashはsymbolizeしないらしい。