OmniAICreator/Qiita-1.07M huggingface dataset:
Oracleで`$HOME/oradiag_<username>`ディレクトリが作られないようにする方法

Oracle 11gから導入されたADRにより、sqlplusを実行すると`$HOME/oradiag_<username>/`というディレクトリが勝手に作られるようになりますが、ウザいので作られないようにするための方法を調査しました。

## 方法 ##

- Ubuntu 14.04
- Oracle instant client 12.1.0.1.0

```bash:$HOME/.bashrc
...
export TNS_ADMIN=$HOME/.oraclerc
```

```$HOME/.oraclerc/sqlnet.ora
DIAG_ADR_ENABLED=off
LOG_FILE_CLIENT=/dev/null
```

### 解説 ###

`sqlnet.ora`に`DIAG_ADR_ENABLED=off`を入れるだけでいいのですが、
1. sqlnet.oraをどこに作ればいいの？
2. `oradiag_<username>`は作られなくなったけど、代わりに`sqlnet.log`ができるんだけど
という2つの問題が出ます。

sqlnet.oraは、TNS_ADMIN環境変数で指定したディレクトリに放り込めばOKです。

sqlnet.logは、出力先をLOG_FILE_CLIENTで指定できます。不要なら/dev/nullへ流し込んでください。

## あとがき ##
もうすぐGWですね。私はGoldenWorkerです。

## 参照サイト ##

http://stackoverflow.com/questions/3520054/what-is-oradiag-user-folder
http://docs.oracle.com/cd/B28359_01/network.111/b28317/sqlnet.htm#NETRF1121
python で mysql からのデータをテキストで受け取る

# 前提
古いシステムや、他のシステムとの互換性の問題でMySQLのデータをテキストで受け取りたいときの方法
（自分メモです）
# 方法
コネクション初期化時に raw=True を指定する

```py
import mysql.connector

db = mysql.connector.connect(
    user="user", 
    password="pwd", 
    host="server", 
    database="database", 
    raw=True)
cursor = db.cursor()

cursor.execute("SELECT * FROM test LIMIT 10")
print cursor.fetchall()
```
結果

```py
[('1', 'name1', '20140419'), ('2', 'name2', '20140106'), ('3', 'name3', '20140214'), ('4', 'name4', '20140212'), ('5', 'name5', '20140110'), ('6', 'name6', '20130930'), ('7', 'name7', '20140421'), ('8', 'name8', '20120507'), ('9', 'name9', '20131127'), ('10', 'name10', '20130918')]
```
row=Trueをつけない時

```py
[(1, u'name1', 20140419), (2, u'name2', 20140106), (3, u'name3', 20140214), (4, u'name4', 20140212), (5, u'name5', 20140110), (6, u'name6', 20130930), (7, u'name7', 20140421), (8, u'name8', 20120507), (9, u'name9', 20131127), (10, u'rname10', 20130918)]
```
# 参照
https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html

|Argument Name|Default|Description|
|:------------|:------|:------------------------------------------------------------------------------|
|raw	|False	|Whether MySQL results are returned as is, rather than converted to Python types.|
プレゼン資料にハイライトされたコードを載せる方法

勉強などのプレゼン資料を作成する際に、コードをSublime Textなどのエディタで見た時のようのハイライトしたいと思って調べたら簡単な方法があったのでその方法のメモです。

## Step.0
[homebrew](http://brew.sh/)をインストールする

## Step.1

コマンドラインツールでインストール：

```
$ brew install highlight
```

## Step.3
自分の書いたコードをハイライトする、例：

```
$ highlight -O rtf test.php | pbcopy
```

こうすることでクリップボードに、`test.php`内に書かれたコードがハイライトされコピーされます。

## Step.4

プレゼン資料などコードを表示したい場所に貼り付ける。

*[highlightの対応する言語やハイライトなどに関してはこちらを参照してください](http://www.andre-simon.de/doku/highlight/en/highlight.php)*

## 参考

[Code highlighting for Keynote presentations](https://gist.github.com/jimbojsb/1630790)
BrowserStackを使ってSeleniumのテストを実施する

# 事前準備
## アカウント登録
* [新規登録ページ](https://www.browserstack.com/users/sign_up)からアカウント登録する
* Trialアカウント(無料)もあります
 * 手動テスト/自動テストに使える時間はそれぞれ30分/100分
 * ブラウザを立ち上げている時間はずっとその時間分減っていくのでご注意を
 * 手動テストに関しては[こちら](http://qiita.com/toruta39/items/b49f34455125f77b7f39)に記事がありました

# 実験環境の構築＆必要なものをインストール
* EC2 Amazon Linux small instance
* 以下はEC2にはいってないので要インストール
 * Ruby(RVM) : 1.9.3

## RVMのインストール(Ruby 1.9.3をインストール)

```
$ curl -L get.rvm.io | bash -s stable
$ source ~/.rvm/scripts/rvm
$ rvm install 1.9.3
$ rvm rubygems latest
$ rvm use --default 1.9.3
```

# テスト作成
* BrowserStackをググるだけの簡単なお仕事をさせてみる
* [AUTOMATE](https://www.browserstack.com/automate)ボタンをクリックする
* Getting started節にある作業をしていく(作業は２つだけ)
 * ```$ gem install selenium-webdriver``` を実行
 * 以下のようにサンプルコードをコピペしてあげる

```rb:browserstack_test.rb
require 'rubygems'
require 'selenium-webdriver'

# Input capabilities
caps = Selenium::WebDriver::Remote::Capabilities.new
caps['browser'] = 'Safari'
caps['browser_version'] = '7.0'
caps['os'] = 'OS X'
caps['os_version'] = 'Mavericks'
caps['resolution'] = '1024x768'
caps["browserstack.debug"] = "true"
caps["name"] = "Testing Selenium 2 with Ruby on BrowserStack"

driver = Selenium::WebDriver.for(:remote,
  :url => "http://[Username]:[AccessKey]@hub.browserstack.com/wd/hub",
  :desired_capabilities => caps)

  driver.navigate.to "http://www.google.com/ncr"
  element = driver.find_element(:name, 'q')
  element.send_keys "BrowserStack"
  element.submit
  puts driver.title
  driver.quit
```

* Username, AccessKeyは[AUTOMATE](https://www.browserstack.com/automate)ページ内の「Username and Access Keys」で確認できる

# テスト実行

* rubyコマンドで実行できます
 * Cucumberでも、Rspecでも同じように実行してあげれば良い
 * ただ、実行する環境がRemoteというだけ

```
$ ruby browserstack_test.rb
```

# テスト結果
* SauceLabsと違って一部始終を動画で撮ってくれる訳ではないが、ページ遷移の度にスクリーンショットは残してくれる
![BrowserStack.png](https://qiita-image-store.s3.amazonaws.com/0/19778/00c3ed92-4eb6-c136-5eb4-9aac83241787.png)
* テスト結果は自分のみ閲覧可能
 * ログインしていなければログイン画面へ
 * アカウントを登録していても権限がないため404でRailsっぽいエラーの画面へ
* チームでの共有で閲覧もできるのだと思われる(今回はTrialアカウントのみの調査なので未実施)

# 備考
* [SauceLabs導入](http://qiita.com/oh_rusty_nail/items/c9ecd60345159c73e20e)でも同じようなテストをしてみたが、圧倒的にbrowserStackのほうが早い(気がする) 

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Zabbix覚書


順次加筆予定

## 障害を検知したらTweetさせてみるテスト
※Tweetするアカウントの取得や設定は今回は割愛

###Actionの設定
アクションのコンディション等は各自必要な条件を記載


####Actionのオペレーション設定
 * オペレーションのタイプ
  - リモードコマンドを選択 
 * リモートコマンド
  - 例
    ```
{HOSTNAME}:/usr/bin/php /etc/externalscript/tweet.php {EVENT.TIME} {ITEM.NAME}
    ```


![Operation](http://ssmo.doara48.com/zabbix-memo/img/zabbix2.2-operation.png)

### tweet script

[twitteroauth](https://github.com/abraham/twitteroauth)を利用してtweetする

```php
<?php

require_once("twitteroauth.php");                                                                             
                                                                                                                           
$consumerKey = "[CONSUMER_KEY]";                                                                                 
$consumerSecret = "[CONSUMER_SECRET]";                                                     
$accessToken = "[ACCESS_TOKEN]";                                                       
$accessTokenSecret = "[ACCESS_TOKEN_SECRET]";
                                                                                                                           

$body = "[ALERT] " . $argv[1] . " :  " . $argv[2] . "で障害なう";

$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);                                   

$req = $twObj->OAuthRequest("https://api.twitter.com/1.1/statuses/update.json","POST",array("status"=> $body ));
?>

```

####結果ツイート

![Operation](http://ssmo.doara48.com/zabbix-memo/img/tweet-alert.png)
HTTPでWebサーバからレスポンスを受け取る



```
using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour {
  public string url = "http://www.google.com";
  public string output = "(ここに結果を表示)";

  private GetViaHttp http;

  void Start() {
    http = GetComponent<GetViaHttp>();
  }

  void OnGUI() {
    // Button
    if(GUI.Button(new Rect(30, 30, 100, 30), "GET via HTTP")) {
      Debug.Log("GET!!!");
      StartCoroutine("GetUrl");
    }
    // TextArea for Output
    GUI.TextArea(new Rect(30, 70, 800, 600), output);
  }

	private IEnumerator GetUrl() {
      Debug.Log("Start2");
	    WWW www = new WWW(url);
	    yield return www;
	    Debug.Log(www.text);
      output = www.text;
	}
}
```
[CSS3]ジグザグの境界線をCSSだけで実現させる

![](http://coliss.com/wp-content/uploads-201402/2014042503-01.png)

こんな感じのジグザグ境界線が画像を使わずに実現させる方法。

```html:HTML
<div class="container1"></div>
<div class="container2 zigzag"></div>
<div class="container3 zigzag"></div>
<div class="container4 zigzag"></div>
```

```css:CSS
.container1 {
  width: 100%;
  height: 200px;
  background: #222;
}
.zigzag {
  position: relative;
  width: 100%;
  height: 200px;
}
.zigzag:before {
  content: "";
  display: block;
  position: absolute;
  top: -10px;
  width: 100%;
  height: 10px;
}
.container2 {
  background: #E2E2E2;
}
.container2:before {
  background:
    linear-gradient(
      45deg, transparent 33.333%,
      #E2E2E2 33.333%, #E2E2E2 66.667%,
      transparent 66.667%
    ),
    linear-gradient(
      -45deg, transparent 33.333%,
      #E2E2E2 33.333%, #E2E2E2 66.667%,
      transparent 66.667%
    );
  background-size: 20px 40px;
}
.container3 {
  background: #FFF;
}
.container3:before {
  background:
    linear-gradient(
      45deg, transparent 33.333%,
      #FFF 33.333%, #FFF 66.667%,
      transparent 66.667%
    ),
    linear-gradient(
      -45deg, transparent 33.333%,
      #FFF 33.333%, #FFF 66.667%,
      transparent 66.667%
    );
  background-size: 20px 40px;
}
.container4 {
  background: #CCC;
}
.container4:before {
  background:
    linear-gradient(
      45deg, transparent 33.333%,
      #CCC 33.333%, #CCC 66.667%,
      transparent 66.667%
    ),
    linear-gradient(
      -45deg, transparent 33.333%,
      #CCC 33.333%, #CCC 66.667%,
      transparent 66.667%
    );
  background-size: 20px 40px;
}
```

[引用元](http://bradsknutson.com/blog/css-zig-zag-border/)
singletonをMockする方法(Kifなどのインテグレーションテスト書くときに便利)

iOSでintegration testを書きたいけど、Facebook SDKのログインフローでつまずいてテストが書けない
こういうときに便利！

### 手段
1. categoryで、既存のメソッドを書き換える
2. ``method_exchangeImplementations``でクラスのメソッドを書き換える

-> categoryで既存のメソッドを書き換えるのが簡単だし分かりやすい

### 実装方法
* KIFでfacebookログインボタンが押されたときに、Facebookの``openWithBehavior``のメソッドが実行されるか

```
@interface WelcomeViewController () 

- (IBAction)authenticateAction;

@end

@implementation WelcomeViewController

#pragma mark - IBActions

- (IBAction)authenticateAction
{
    self.session = [[FBSession alloc] initWithAppID:kFacebookAppID permissions:kFacebookPermissions urlSchemeSuffix:kFacebookUrlSchemeSuffix tokenCacheStrategy:nil];
    
    [self.session openWithBehavior:FBSessionLoginBehaviorWithNoFallbackToWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        //login code
    }];
}

@end
```

```test
static id mockSession = nil;

@implementation FBSession (UnitTests)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

- (instancetype)initWithAppID:(NSString *)appID
                  permissions:(NSArray *)permissions
              urlSchemeSuffix:(NSString *)urlSchemeSuffix
           tokenCacheStrategy:(FBSessionTokenCachingStrategy *)tokenCachingStrategy {
    return mockSession;
}

#pragma clang diagnostic pop

@end

@interface WTDLoginFlowTest : KIFTestCase

@end

@implementation WTDLoginFlowTest

- (void)testSuccessfulLogin
{
    mockSession = [OCMockObject mockForClass:[FBSession class]];
    
    [[mockSession expect] openWithBehavior:FBSessionLoginBehaviorWithNoFallbackToWebView completionHandler:nil];
    
     [tester tapViewWithAccessibilityLabel:@"登録・ログイン"];
}
@end

```

### 参考
* categoryを使う方法 http://twobitlabs.com/2011/02/mocking-singletons-with-ocmock/
* method_exchangeImplementationsを使う方法 http://www.levelofindirection.com/journal/2013/7/11/injecting-singletons-in-objective-c-unit-tests.html
* 既存クラスのカスタマイズ方法について(公式) https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
* categoryでmethodが重複したことによるwarningを消す方法 http://stackoverflow.com/a/9622779/2387436
Linux サーバで使用している DNS の安全性をチェックするワンライナー

この記事で紹介されている方法をもとにしています。
[Geekなぺーじ:DNSキャッシュポイズニングの基本と重要な対策](http://www.geekpage.jp/blog/?id=2014/4/25/1)

Ruby が必要です。

```bash
ruby -ane 'puts "Testing at #{$F[1]}...";puts `dig @#{$F[1]} +short porttest.dns-oarc.net TXT`;puts' /etc/resolv.conf
```

/etc/resolve.conf 内のすべての DNS に対してチェックを行います。
GREAT って出れば大丈夫、POOR や GOOD と出るものについては対策が必要。 (詳細は元記事を参照)

ネットワーク弱者なので突っ込みどころありましたらお願いします。
DeployGate iOS SDKをTitanium Mobileで使う方法

2014/4/23にmixiからリリースされたdeploygate ios sdkをtitanium mobileから使えるようにするモジュールを作ってみました

http://mixi.co.jp/press/2014/0423/12188/

## git repos
https://github.com/abui-tech/TiDeploygate

## 主な機能
1. リモートログ出力
2. deploygateユーザー認証
3. アップデート通知

deploygate ios sdkが提供する機能のほぼ全てを使うことができます！

## 使い方
1. deploygate ios sdkを手に入れる https://deploygate.com/docs/ios_sdk
1. TiDeploygateをチェックアウトし、ルートディレクトリにある ti.deploygate-iphone-0.1.zip の中にある module.xcconfig のframework参照先を書き換える
  `OTHER_LDFLAGS=$(inherited) -framework DeployGateSDK -F"[ここをdeploygate ios sdkがある場所に書き換える]"`
1. ti.deploygate-iphone-0.1.zipをプロジェクトにインポートする
1. ユーザー認証を使う場合は プロジェクトの Info.plist に deploygateが指定するurl schemeを追加してください

## サンプル
- tiapp.xml  
<pre>
    &lt;modules&gt;
        ..................
        &lt;module version="0.1" platform="iphone"&gt;ti.deploygate&lt;/module&gt;
    &lt;/modules&gt;
</pre>
- Info.plist
<pre>
    ........
    &lt;key&gt;CFBundleURLSchemes&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;..............&lt;/string&gt;
        &lt;string&gt;[deploygateが指定するurlスキーマをいれる]&lt;/string&gt;
    &lt;/array&gt;
    ........
</pre>
- js(クラシックスタイル)
<pre>var TiDeploygate = require('ti.deploygate');
var win = Ti.UI.createWindow({backgroundColor:'white'});
    var label = Ti.UI.createLabel({
            text: 'ti.deploygate',
            width: Ti.UI.SIZE,
            height: Ti.UI.SIZE
    });
    win.add(label);
    win.open();
    win.addEventListener('open', function () {
        // authorとkeyとユーザー認証ありなし(trueだとユーザー認証あり)を指定する
        TiDeploygate.setup("[author]", "[key]", true);
    });

    Ti.App.addEventListener('resume', function (e) {
        var args = Ti.App.getArguments();
        if(args&&args.url){
            // ユーザー認証ありの場合ここにくる
            TiDeploygate.recieveURLScheme(args.url);
            TiDeploygate.remoteLog("log to deploygate");
        }
    });
</pre>

実はちゃんと検証してません＞＜ 

が、動くはずです(￣ー￣)
gitのコミットグラフをgraphvizで画像にしてみる

# gitのコミットグラフをgraphvizで画像にしてみる

別に何もいい事ないけど、なんか調べたらできそうだったのでやってみた。
https://git.wiki.kernel.org/index.php/Aliases#Use_graphviz_for_display

```conf:.gitconfig
[alias]
        graphviz = "!f() { echo 'digraph git {' ; git log --pretty='format:  %h -> { %p }' \"$@\" | sed 's/[0-9a-f][0-9a-f]*/\"&\"/g' ; echo '}'; }; f"
```

これをgraphvizに食わせると

```bash:bash
git graphviz HEAD~10..HEAD | dot -Tpng > graph.png
```

こんな感じになる。

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/41925/3bc59f18-44a0-eef7-3bb1-ed766fa46005.png)


## 使い道…？

あんま思いつかない。

`.gitconfig`の`[alias]`でdot言語に書き出してるとこ多少調整すれば、
スライドとかの説明画像に使えるくらいにはできるんじゃないかなぁ、という気がする。
気がするだけ:)


## 追記

dot言語にurl埋め込む事ができるらしいので、
http://readingmonkey.blog45.fc2.com/blog-entry-644.html

頑張ればクリッカブルなチャートっぽくできるかもしれない。
頑張れば:)

なんかgitlabのプラグインかなんかでやってる人いそうだな。

## 続き

awkでゴリ押してみた。
http://qiita.com/arc279/items/d8cd12d3f09c94c01726
iOS7で起動時にsafariへ飛ばすときにはGCDを使う

アプリで自サイトのcookie情報を取りたい時など、起動時にopenURLを使いcustom url schemeで戻すといったことをすると思います。
iOS7ではApplicationDelegateのapplication:didFinishLaunchingWithOptions:等からopenURLを呼んでしまうと、上手く起動せず固まってしまいます。
その対処方法として、一旦GCDを使ってUIスレッドで実行するように指定し、起動処理が終わった後で実行されるようにすると固まることなくsafariへ遷移できます。

```objc

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    dispatch_async(dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://example.com"]];
    });

    return YES;
}
```

なんとなく根本的な理由がモヤモヤしておりますが、とりあえずこれでサクッと動くようになります。

参考: [OpenUrl freezes app for over 10 seconds](http://stackoverflow.com/questions/19356488/openurl-freezes-app-for-over-10-seconds])
WebフォントのCSSとライセンス記載例


何かと便利なWebフォント。でもライセンス周りが心配なので、メジャーそうな以下のライセンスの書き方を整理してみました。  
無料で使えるからこそ敬意を払って、ライセンスはちゃんとしたいですよね。

- SIL Open Font License (OFL)
- IPAフォントライセンスv1.0
- Apache License 2.0


## SIL Open Font License (OFL)

```CSS
/*!
 * "FontName" licensed under the SIL Open Font License
 * http://www.hogehoge.com/（配布元のURL）
 */
@font-face {
	font-family: 'FontName';
	src: url('FontName.eot?') format('oldIE'),
	     url('FontName.woff') format('woff'),
	     url('FontName.ttf') format('truetype');
	font-weight: normal;
	font-style: normal;
}
```


## IPAフォントライセンスv1.0

```CSS
/*!
 * "FontName" licensed under the IPA Font License Agreement v1.0
 * http://www.hogehoge.com/（配布元のURL）
 * http://ipafont.ipa.go.jp/（IPAフォントのURL）
 * http://ipafont.ipa.go.jp/ipa_font_license_v1.html（IPAフォントライセンスv1.0のURL）
 */
@font-face {
	font-family: 'FontName';
	src: url('FontName.eot?') format('oldIE'),
	     url('FontName.woff') format('woff'),
	     url('FontName.ttf') format('truetype');
	font-weight: normal;
	font-style: normal;
}
```

### IPAフォントライセンスの表記について
こっちはやや冗長な気もするけど、色々考えた結果この形に。その色々は長いのでこっちで整理。

- [WebフォントのCSSとライセンス記載まとめ](http://www.rakuin.com/notes/programming/css/webfont-license.html)


## Apache License 2.0

```CSS
/*!
 * Copyright (C) 2014 （配布者の名称）
 *      http://www.hogehoge.com/（配布元のURL）
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
@font-face {
	font-family: 'FontName';
	src: url('FontName.eot?') format('oldIE'),
	     url('FontName.woff') format('woff'),
	     url('FontName.ttf') format('truetype');
	font-weight: normal;
	font-style: normal;
}
```


## 追記（2014-12-02）

Apache License 2.0 を追記しました。源ノ角ゴシックがこれでした。
とはいえ、この表記で問題ないのか不安なので、やっぱりこうすればOK！というマニュアルが欲しいです。


## 追記（2019-04-24）

YUI Compressor などでコードを圧縮しても消えないようコメントアウト方法を修正しました。
@ayanok さん、ありがとうございました。
/vagrant以下でRailsアプリを動かすと遅い

# /vagrant以下でRailsアプリを動かすと遅い

vagrantを使って仮装環境を構築すると、
HostとGuestで共有できる/vagrantがマウントされます。

ここでRailsアプリを動かすとかなり遅くなります。
(表示に数秒かかることもあります)

Guest OS側のディレクトリで動かすとdevelopment環境でもサクサク動きます。

ちなみに、/vagrant以下ではUnixソケットがはれないようなので、Nginxとunicornを連携させる場合なども注意が必要です。
An "example" usage of Highcharts in a React.JS component using David Nolen's Mori.js (edited: with Addons.Update

# With Mori

Terrible title, I know.

The rationale for using Mori comes from my desire to use immutable collections in dealing with properties that are transformed when incorporated into my React components. 

This really helps when you have to modify your properties in order to fit them into a format for another library to consume while trying to have the data separated out for your own organization/sanity. 

If you've ever played with Highcharts, my code should be very simple to follow, but the gist of it is that while I need a chart options object that contains other objects like "chart", "xAxis", "series", and whatnot, I really would like to split up the properties passed into my component.

My chart object is basically constructed as such:

```clj
(assoc chart
		:chart
		(assoc (:chart props)
				"renderTo" {{myDOMNode}}
				width (:width props)
				height (:height props))
		:series
		(:series props))
```

Anyway, here's the "implementation": http://jsfiddle.net/kimagure/UP2Qd/1/

Obviously, it's very broken and barely functional, but it's just a demonstration of how properties can be fed into my component to make it change accordingly.

Hope this is helpful in some way and/or sparks an idea on how to improve on this very basic implementation.

#Revisited with addons.update

Since the 30KB gzipped size of mori can be very unappealing to people, I have revisited this and used React's experimental Immutability Helpers ('Addons.Update'). This comes with React when you just add react-with-addons.js instead of react.js.

```js
var chartOptions = React.addons.update(chartModel, {
  chart: {
    renderTo: {$set: selector}
  },
  series: {$set: seriesModel}
});
```

Syntax is kind of ugly, but this seems to work pretty nicely: http://jsfiddle.net/kimagure/UP2Qd/3/

By the way, I have this pushed onto Github if you want to check it out: https://github.com/kimagure/highcharts-mori-test
Bash/Zshでviキーバインディング

出典：[Use vi shortcuts in terminal](http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal)

まとめ
======

+ Bashの場合、~/.inputrc に以下を追記

```~/.inputrc
set editing-mode vi
set keymap vi-command
```

しかしこれ、readlineにリンクしてるバイナリだと全面的に効いちゃう(editline環境だとどうなるんだろう）。Bash限定なら下記。

```~/.bashrc
set -o vi
```

+ Zshの場合、~/.zshrc に以下を追記

```~/.zshrc
bindkey -v 
```

書き換えたら```exec $0```でシェル再起動。

チートシート
==========

[Bash(Readline)の場合のチートシート](http://www.catonmat.net/blog/bash-vi-editing-mode-cheat-sheet/)はある。

TODO
====

+ Zsh用のチートシートはどこかにあるか？
+ 画面中にモード表示できる方法を探す。見た目でわからないと結構つらい。
csplitでキーワードでファイルを分割する

# csplitでキーワードでファイルを分割する

いきなりだけど、詳細はこの辺見るといいと思う。とても詳しい。
http://takuya-1st.hatenablog.jp/entry/20110823/1314108412

## こんな時

* 本番DBのバックアップ取って来たけどなんか大量にDATABASEがあってファイルが超でかい。
* 必要なところだけ抜き出したいけど、サイズがGB単位なのでとてもじゃないけどvimとかemacsなんかじゃ開けない。

## たとえば

mysqldumpの場合、

```bash:bash
mysqldump --databases db1 db2 db3 > dump.sql
```

とか複数DBをまとめてdumpすると、DATABASE同士の区切り（というか次のDATABASE定義の開始位置）は

`CREATE DATABASE /*!32312 IF NOT EXISTS*/ ｀db1｀ /*!40100 DEFAULT CHARACTER SET utf8 */;`

みたいになってるので、`CREATE DATABASE`で区切ってやるといい。

```bash:bash
csplit dump.sql /CREATE\ DATABASE/ {*}
```

`{*}` は全てのマッチ部分で分割する指定。

`xx00
xx01
xx02
xx03
`

こんな感じで順番に出力される。

区切りに指定したキーワードは、 **キーワードのマッチした次のファイル** に入るので、
この場合、`xx00`はヘッダコメントとかの必要ない部分。
`xx01`から順番に、dumpしたファイルの先頭からDATABASE単位で分割されてる。

それでもまだファイルがでかい場合、単体DATABASEファイルをさらにテーブル単位で分割したりしたらよいと思う。

```bash:bash
csplit --prefix=table_ xx01 /DROP\ TABLE\ IF\ EXISTS/ {*}
```

とか

```bash:bash
csplit --prefix=table_ xx01 /CREATE\ TABLE/ {*}
```
みたいな感じで。

## macの人

bsdの`csplit`は残念なので、brewで`gnu coreutils`入れて`gcsplit`使うといい。

## 余談

`less` だと全部一気にメモリに読み込まないので、でかいファイル開いても固まったりしない。
どんなキーワードで分割するかとか、ちょっと中身確認するのには`less`使うといい。
PHPには配列がなかった

これはわかる。

```php
$x=["bravo","charlie","alpha"];
print_r($x);
/*
Array
(
    [0] => bravo
    [1] => charlie
    [2] => alpha
)
*/

sort($x);
print_r($x);
/*
Array
(
    [0] => alpha
    [1] => bravo
    [2] => charlie
)
*/
```

これがわからない。

```php
$x=["bravo","charlie","alpha"];
print_r($x);
/*
Array
(
    [0] => bravo
    [1] => charlie
    [2] => alpha
)
*/
asort($x);
print_r($x);
/*
Array
(
    [2] => alpha
    [0] => bravo
    [1] => charlie
)
*/
foreach($x as $y) echo $y,"\n"
/*
alpha
bravo
charlie
*/
```

つまりPHPには配列などない。すべて順序付きハッシュだ。
なので、数値で直接indexを与えても、foreachはindexの順に処理されないのだった。

```php
$x[2]="bravo"
$x[3]="charlie"
$x[1]="alpha"
foreach($x as $y) echo $y,"\n";
/*
bravo
charlie
alpha
*/
```

なるほど。むしろ順序が保証されてるから楽なのか。
ググったらみんな同じような発見をしている様子。
しかしそういう自由な使い方ができるという意味では、要素数とcount()が一致しない場合とか、インデックスが0から始まらない場合もあるだろうから、

```php
for($i = 0; $i < count($array); $i++) {
  echo $array[$i];
}
```

みたいにcount()とforで回すのは良くないのでは。例えば上の例から引っ張ってくると

```php
$x[2]="bravo";
$x[3]="charlie";
$x[1]="alpha";
for($i=0;$i<count($x);$i++) echo $x[$i],"\n";
/*
PHP Notice:  Undefined offset: 0 in Command line code on line 1

alpha
bravo
*/
```

この場合はksort()を使えばいい。

```php
$x[2]="bravo";
$x[3]="charlie";
$x[1]="alpha";
ksort($x);
foreach($x as $y) echo $y,"\n";
/*
alpha
bravo
charly
*/
```

改めて見ると[キーのキャスト](http://jp2.php.net/manual/ja/language.types.array.php)もなかなか難しい雰囲気。整数値と文字列だけキーにして、nullと空文字に気をつけるのがベターか。
ランダム文字列をたくさん生成する

[a-zA-Z0-9]{16}なランダム文字列をたくさん生成する。
シェルで実行するワンライナー

```bash
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 32 | sort | uniq
```

`tr -dc 'a-zA-Z0-9'` 含める文字種
`fold -w 16` 生成する文字列の文字数
`head -n 32` 生成する件数

念のため、生成したい件数分出力されているか確認が必要。
ちゃんとスクリプトを書けばいいんだけど、簡単に済ませたいときはこれでいいかな。

実行結果はこんな感じ。

```bash
$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 8 | sort | uniq
4QrrCixUp7SH64k0
7C0jFVNj7TmFTK96
8GQeLqyfkHiFiDtu
8sLaDqQf9dNHNzDd
k0Jg6PzlbzRSQCdM
liw3Q0ALIDySM9io
qFxlNKdOPHQueD4T
rBC0EMUCisXTDobs
```
Android でHTTP通信（ダウンロードとか）させる実装をする前に理解しておくこと

# 初心者向けです

我らが @KeithYokoma が素敵な記事「Java - HttpUrlConnection とエラーハンドリング - Qiita - http://goo.gl/hX9FVV 」を書いていたので、初心者向けに書きます。

## けつろん

- HttpUrlConnection 使え
- DefaultHttpClient 古いデバイスサポートするなら使え
- AndroidHttpClient 使うな

## まとめ

### HttpUrlConnection

軽量APIでバッテリーにも優しい

### DefaultHttpClient

Apache のHTTP Clientの実装で、機能も豊富。

### AndroidHttpClient

放置されているかわいそうな子

## ちゅうい

新しいめのAndroidでは、UIスレッド（メインスレッド）ではHTTP通信させないようになってます。NetworkOnMainThreadException 例外が発生したら、面倒でも AsyncTask とか AsyncTaskLoader 使って、そこから通信させてください。面倒でごめんね。

あと、DefaultHttpClient 使う場合はタイムアウトの設定は忘れずに。デフォルトでは永遠に待つようになってるよ。

```java
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 8000);// 8秒（★自分で変更して）
HttpConnectionParams.setSoTimeout(httpParams, 4000);// 4秒（★自分で変更して）
    		
HttpClient client = new DefaultHttpClient(httpParams);
```

## よんでおくべき記事

- HttpUrlConnection とエラーハンドリング - Qiita - http://goo.gl/hX9FVV
- Y.A.M の 雑記帳: Android　Apache HTTP Client と HttpURLConnection どっちを使うべき？ - http://goo.gl/4PZHPy

## あとがき

- グロースハッカー消えてください
Struts2 脆弱性対策

[元ねた][1]

## 対応

```diff
<interceptor-ref name="params">
  <param name="excludeParams"><!-- 省略しています --></param>
+ <param name="paramNameMaxLength">20</param>
</interceptor-ref>
```


| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
| c| l| a| s| s| .| c| l| a| s| s| L| o| a| d| e| r|




リクエストパラメーター名称の文字数を制限する。


### 参考

```java:ParametersInterceptor
    protected boolean acceptableName(String name) {
        boolean accepted = isWithinLengthLimit(name) && !isExcluded(name) && isAccepted(name);
        if (devMode && accepted) { // notify only when in devMode
            LOG.debug("Parameter [#0] was accepted and will be appended to action!", name);
        }
        return accepted;
    }

	protected boolean isWithinLengthLimit( String name ) {
        boolean matchLength = name.length() <= paramNameMaxLength;
        if (!matchLength) {
            notifyDeveloper("Parameter [#0] is too long, allowed length is [#1]", name, String.valueOf(paramNameMaxLength));
        }
        return matchLength;
	}
```

## 大文字小文字で問題になるといってたから調べてみた

```xml
<interceptor-ref name="params">
	<param name="excludeParams">(?i).*class.*, ..省略.. </param>
</interceptor-ref>
```

確認URL `/index.action?CLASS`

### 結果

```text
ParametersInterceptor - Parameter [CLASS] is on the excludeParams list of patterns! 
```


[1]: http://qiita.com/akiramuramatsu/items/71882fd06d0eac21645c#3-2
PHPにラムダ式が入ったので、出力のキャプチャが簡単になった

PHPにラムダ式が入ったのは結構前ですが、これで`var_dump`なんかが少し楽になるので紹介。

```php
function capture($func) {
  ob_start();
  $func();
  $ret = ob_get_contents();
  ob_end_clean();
  return $ret;
}

// var_dump の戻り値が取れる
$debug_info = capture(function() { var_dump($my_obj); });

// 実行したスクリプトの標準出力結果が取れる
$command_out = capture(function() { system("ls -al"); });
```

あってよかったラムダ式。
あとはもう少し構文が短ければよかったのに
二元配置分散分析

[昨日](http://qiita.com/ynakayama/items/d332d77ae40a6827345b)は一元配置分散分析について書きましたのでその続きです。

## 二元配置分散分析

2 つの要因 A, B にそれぞれ水準があるとします。 2 つの要因が互いに無関係だとしたとき、各水準の母平均に差があるか検定するのが二元配置分散分析です。

水準の組 (Ai, Bj) の母平均 μ_ij は

```math
\mu_{ij} = \mu + \alpha_i + \beta_j
```

と表され、

```math
\sum_{i=1}^{\alpha} \alpha_i = 0 \\
\sum_{j=1}^{\beta} \beta_j = 0 \\
```

とします。

データの構造式として次式を考えます。

```math
x_{ij} = \mu_{ij} + \epsilon_{ij} = \mu + \alpha_i + \beta_j + \epsilon_{ij}
```

ただし ε_ij は互いに独立に正規分布 N(0, σ^2) に従います。



|仮説|説明|
|:--|:--|
|帰無仮説|要因 A,B の効果が無い、つまり α_1 = α_2 = ... = α_α = 0, b_1 = b_2 = ... = b_b = 0|
|対立仮説|要因 A,B の効果がないという仮説を否定する根拠となるほどに差が大きい|

解法としては総平方和を次のように分解します。

```math
S_r = \sum_{i=1}^\alpha \sum_{j=1}^\beta (x_{ij} - \overline{x})^2 \\

= \beta \sum_{i=1}^\alpha(\bar{x}_{i・} - \overline{x})^2 + \alpha \sum_{i=1}^\beta(\bar{x}_{・j} - \overline{x})^2 + \sum_{i=1}^\alpha \sum_{j=1}^\beta (x_{ij} - \bar{x}_{i・} - \bar{x}_{・j} + \overline{x})^2 
```

右辺第一項を A 間平方和 S_A
右辺第ニ項を B 間平方和 S_B
右辺第三項を残差平方和 S_e

と呼びます。

残差平方和の自由度は

```math
\phi_T - \phi_A - \phi_B = ab - a - b + 1
```

となります。

## 参考

日本統計学会公式認定 統計検定1級対応 統計学
http://www.amazon.co.jp/dp/448902150X
rails has_manyに条件を指定する

既存DBで、論理削除が利用されていたため、以下のように対処しました。
論理削除については、gemを利用する方法もあるようですが、いまのところ未調査。

```rb
class Account < ActiveRecord::Base
  # テーブル名指定
  self.table_name = 'm_account'

  has_many :company_accounts, foreign_key: :account_id
  has_many :companies, through: company_accounts, conditions: "#{CompanyAccounts.table_name}.delete_flag = 0"
```

せめてconditions以下をよりスマートにかければ良いのですが…。
NSDataとNSStringの相互変換


ググればすぐ出てくるけどよく忘れるのでメモ。
カテゴリとして実装し、`asData`や`asUTF8String`などを生やして使うのが楽かも知れない。

# NSData to NSString

```objectivec
NSString *string = [[NSString alloc] initWithData:data 
                                         encoding:NSUTF8StringEncoding];
```

# NSString to NSData

```objectivec
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
```

----

参考

* [Convert UTF-8 encoded NSData to NSString](http://stackoverflow.com/questions/2467844/convert-utf-8-encoded-nsdata-to-nsstring) カテゴリ実装するアイデア良さそう
* [NSData と NSString の相互変換](http://d.hatena.ne.jp/watanata2000/20111128/1322468735)
Core Dataのエンティティ生成時に自動的に項目を登録

Core Dataを使ったアプリケーションをつくる際、データを日付順にソートすることはよくあると思う。そのためにエンティティに created_atや updated_atといった属性を追加するが、エンティティのinsertのたびにcreated_atを自分で登録するのは面倒臭い。

ので、これを自動化する方法。

まずデータモデルの編集。 created_at属性を追加

![スクリーンショット 2014-04-25 10.27.03.png](https://qiita-image-store.s3.amazonaws.com/0/3847/08c38fa2-526c-e2ca-d628-e64619fd64e5.png)

次にデータモデルインスペクタを開き、Classのところにエンティティが相当するNSManagedObjectのサブクラス(この場合AlbumEntity)を入れる

![スクリーンショット 2014-04-25 10.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/3847/123fb473-242f-2887-b080-811865a51f50.png)

最後にAlbumEntityの実装の中で以下のような初期化メソッドを追加

```objc
- (void)awakeFromInsert {
    [super awakeFromInsert];
    self.created_at = [NSDate date];
    self.updated_at = self.created_at;
}
```
active_record 既存DBの関連テーブルを利用する

既存DBを利用してrailsすると色々と弊害がでてきます。
次のような多対多の関連テーブルに対するリレーションを紹介します。
（前提として複合キーのgemを利用している事とします。）

既存DBを使ったrailsについては、以前はてなブログにUPした
[既存DBを使ってrailsしてみた。](http://hmu29.hatenablog.com/entry/2014/02/14/001513)も参考になるかもしれません。

テーブル構成（人と会社が多対多関係って少ない気もしますが…）

Companyテーブル
- company_id(主キー)
- name

Personテーブル
- person_id(主キー)
- name

CompanyPersonテーブル
- company_id(主キー)
- person_id(主キー)

```rb
class Company < ActiveRecord::Base
  #主キー名を変更する
  self.primary_key = :company_id

  #関連テーブルの関連づけ
  has_many :company_people, foreign_key: :company_id
  # Personテーブルを関連づけ
  has_many :people, through: company_people
end

class Person < ActiveRecord::Base
  self.primary_key = :person_id
  has_many :company_people, foreign_key: :person_id
  has_many :companies, through: company_people
end

class CompanyPerson < ActiveRecord::Base
  self.primary_keys = :company_id, :person_id
end
```
オブジェクトの名前を連番にする

オブジェクトを選択して名前を変えるエディタスクリプト。
オブジェクトをコピーしたら同じ名前のがたくさんできてどれがどれだか分かんない状態になった時に使う。

```csharp
using UnityEngine;
using UnityEditor;
using System;
using System.Text.RegularExpressions;

public class OrderingName : Editor
{
    [MenuItem("Editor/オブジェクト名を連番にする")]
    static void Ordering()
    {
        Undo.RecordObjects(Selection.objects, "modify name");

        int count = Selection.objects.Length;
        int d = count.ToString().Length;

        for (int i = 0; i < count; i++)
        {
            string name = Selection.objects[i].name;
            name = Regex.Replace(name, @"_(\d)+$", "");
            Selection.objects[i].name = name + "_" + i.ToString().PadLeft(d, '0');
        }
    }
}
```
ファイルが指定時刻より新しいか判定

* Macのdateコマンドは`-d`がLinuxと違うので機能しません。

# 書式

*  A -ot B : AはBより古い
*  A -nt B : AはBより新しい

```bash:access_logが10分以上前か判定
# 更新日時が10分前の一時ファイルを作成
TOUCH_TIME=`date -d '10 minute ago' '+%m%d%H%M'`
touch -t $TOUCH_TIME "tmp_10_minute_ago"

if [ "target_file" -ot "tmp_10_minute_ago"  ];then
  echo "target_fileが無い場合、もしくは更新時刻が10分以上前"
else
  echo "target_fileの更新時刻が10分以内"
fi

rm -f "tmp_10_minute_ago"
```
Struts の脆弱性について

# 攻撃コードも公開されて騒ぎになっていますが、攻撃側がやり放題になりますので至急対応しましょう

リクエストパラメーターに特定のパターンがあるので、そこで遮断できるのがポイントです

## たいおう

Apache Struts 2の脆弱性が、サポート終了のApache Struts 1にも影響<br />～国内でいまだ大量稼働するStruts 1利用企業に、直ちに緩和策を～ | セキュリティ情報 | 株式会社ラック - http://goo.gl/pXi54f

にあるように、

### 《Struts 1の場合》
サポートが終了しているため、公式アップデートは提供されないと思われます。しかし、提供ベンダーが個別のサポートを実施していることもありますので、その場合は当該ベンダーの指示に従ってください。そうでない場合は、次のような影響緩和策が有効です。

- 不正な文字列がパラメータに含まれる場合（正規表現：「(^|\\W)[cC]lass\\W」に合致するパラメータ名が含まれる場合等）にリクエストを拒否するフィルタ機能を実装する。
- WAF、IPSなどネットワーク側で当該攻撃を遮断する。

### 《Struts 2の場合》

CVE-2014-0094では2.13.16.1で修正されているとされていますが、修正が不十分であることが報告されています（※）。報告されている暫定対応を行うか、今後リリースされるバージョンを適用してください。

## いっぱんてきな問題

Struts に限りませんが、脆弱性により直接任意のコードが実行されることもそうですが、実行可能なエリアに任意のファイルが作成される可能性がある状態、が危険です。任意のファイルが作成される可能性の方が、任意のコードを実行するよりも脆弱性としては存在する可能性が高いです。jsp ファイルはウェブアプリケーションサーバー上で実行可能なスクリプトです。jsp が設置されるディレクトリに、拡張子 .jsp のファイルを設置できれば攻撃は完成します。

### 公開されている攻撃方法について

今回、ログの出力先を .jsp 実行可能なエリアに変更云々、という攻撃手法が公開されています。ログの出力であれば、パーミッションの制限をうまく回避しつつ、簡単に任意のコードを書き込むことができるという残念ながら上手な方法です。

### ほんとうにあった怖い話

その昔、とあるウェブサービスを提供する企業が、システム連携するために使ってくださいと渡されたコード（モジュール）がこんな実装でした

- 外部サーバーにHTTPリクエストを投げてファイルをダウンロード
- そのファイルを .jsp として設置
- .jsp 内の関数を読んで連携完成

怖くて実装を拒否しましたが、便利ゆえの危険性を認識して、許容できる範囲内の実装をしてほしいものです。
古賀光雄さんを囲む会


昨日参加した「古賀光雄さんを囲む会」にての講演でお聴きした内容を箇条書きにまとめてみました。

```
古賀光雄さんを囲む会について

古賀光雄さんは、20年以上もの間、ベンチャーの育成のために尽力されており、上場、未上場を問わず、支援したベンチャー企業は数多くあります。
今回は、古賀光雄さんに酸いも甘いも噛み分けた経験談を語っていただき、その後懇親する会を開催します。

スケジュール
１８：３０～１９：３０　講演（古賀マネージメント総研㈱　古賀光雄代表）
１９：３０～２１：３０　懇親会

```

```
略歴（古賀マネージメント総研㈱　古賀光雄代表）

1946(昭和21)年12月1日生 福岡大学商学部卒業1984(昭和59)年に公認会計士登録後、監査法人トーマツ代表社員、トーマツ コンサルティング（株）代表取締役、トーマツ･ベンチャーサポート（株）代表取締役を経て、 2012(平成24)年2月14日　古賀マネージメント総研（株）設立　代表取締役就任
```

```
イオンの農業融資

・イオン・ヨーカ堂は販路を持っている
・製造まで行うようになった
・食材に必要な農業に融資するようになった
```

```
ヤマト運輸

販売は
　「製造する」
　「運送する」
　「購入する」
3者で成り立っているが、日本では「運送する」ことに対する価値が認められていない。
そこでヤマト運輸はネット通販の後払いをはじめたり、宅配の際に商品を売るなど、
「自分の業種に付加価値つける」ことに取り組んでいる
```

```
金融機関、高齢者サポート

高齢者への対応世の中の必然
→団塊の世代が高齢者になったときどうするか？

認知症のお客の対応など考えざるをえない
```

```
地域ブランド戦略

・地域の差別化は話題性やブランドイメージが必要である。
・自分のところだけでやっても広がらない
・他商品と結びつけて広げる
・結びつけて関係を持つと相手を好きになる
・好きになるとアイデアが出てくる
```

```
ブランド戦略におけるデザインの重要性

・ベンチャー企業はデザインが劣っている事が多い
・デザインはブランドイメージそのものである。
・同じものを売るにしても、グッズに入れるだけで販売が伸びる、など。
　（納豆除菌スプレーだけでは売れなかったものが、除菌機能があるぬいぐるみにすると売れる）
```

```
ソニーの不動産参入

・IT業界が他業界のビジネスに進出
・ソニーの不動産参加はひとつに過ぎず、新規事業を3年で10を超える数育てる
・IT業界はインターネット・携帯電話・スマホといったインフラを押させてそこから他業種に参加に来ている
（ソフトバンク：回線　グーグル：検索　MS：OSといったところ）
```

```
ホールディングカンパニー（持株会社）

・財閥の復活
・銀行は独占禁止法で異業種がもてないが、ホールディングカンパニーは銀行すら持てる
　（セブン銀行・イオン銀行・ソニー銀行等）
・東証もどんどんM&Aしておりほぼ独占状態
・なぜ財閥復活か？というと海外と戦うため
・メガバンクも３行しかない。
・独占・寡占状態にしてやっと世界と戦える
・ホールディングカンパニーを企業戦略に活かす必要がある
・仲間を作る
・スピードと知恵を出し合い加速する
・情報を知恵にしてはやく動かないといけない
```

```
インターネット・スマホ

・ネットで売れないものはない
・スマホで検索にヒットしない会社は存在しない会社と同義
・HPはあっても売ろうとしていない
・動画を利用して商品・サービスへの愛情や情熱が伝わるように
・車もネットで販売されている
・ネットで数量限定で売ることで価値が下がらない→ニッチな商品が売れる
```

```
ものを売るということ

・喜ぶものをつくること
・家族や身近な人が買わないものは売れない
　→マーケティングツール
```

```
ベンチャー企業の最大の課題

・No2,No3が出てきたら本物となる
・一人でやっていると会社拡大は無理
・本音・悪口が言えるのが仲間
・本音でビジネスを語り合える仲間をつくる必要がある
```

```
従業員

・お客を満足させるのは従業員
・自社の商品を惚れ込んでないと売れない
・それには教育がいる
・思い・知識・愛情を共有する教育が必要
・従業員が惚れ込んでいる商品は本気度が伝わり売れる
・自分が疑問に思っているものが売れるわけがない
```

```
働きがいのある職場とは？

・人を使うということは使われる人のことを考えること
　→それを理解していないと人を評価してはいけない
・お金ではなく気配り（生活環境・家族構成・健康状態等一人ひとりを熟知する）
・叱る必要はあるが、思いをきちんと伝える
・従業員の家族のことをしっかり知らないといけない
```

```
企業成長の壁

・売上5億円は50人程度の社員数
　→社員の顔が経営者がわかる範囲
・10億→30億の規模になると経営者一人では見きれない
　→人の教育をしてまかせていくことが必要
・ものづくりが好きな経営者は、経営自体がめんどうになるので破綻する
・経営者は規模により機能が変わっていく
```

```
経営におけるコミュニケーションの破綻

・社長が現場にいかなくなる
　→任せると現場を知らないのは大きく違う
　→オーナーでないとわからない数字がある
　→人に任せるところと自分でやらあければならないことがある
```

```
上司と部下のコミュニケーションについて

・上司が熱心にはなしても部下には思っているほど理解されない
・上司のコミュニケーションで必要なのは話すことではなく聴くこと
・もっとじぶんたちの話を聞いてほしいと部下は望んでいる
・上司の独演会はただのマスタベーション
・部下は最大の味方である
・仲間をつくるなら会話を育てる
・反応のいい人との出会いが大事で反応の良い人たちを周りに置く
```

```
営業活動とは

・愛情と情熱
・相手のニーズを捉えタイムリーに対応できる力が必要
・営業活動とは顧客に貢献するだけでなく、地域を活性化し、新しい産業と雇用を生み出す
・地域と共に成長したい【志・愛情・情熱】もった専門家を多くつくる
・商品動画とか言葉以外で営業できるテクニックを身につける
・営業は人と人との関係
```

```
経営

・売上高でなく経常利益率
・粗利
・月次決算をしているか
・10日以内に締めてすぐに対応しているか？
・月次決算をしていないところは予算がない
・予算がないと目標がない
・目標がないと成長ができない
　→達成できなかったら業務回線
・売上高ではなく率でみる
・率がいいということは資金繰りがよくなる
・効率がいいビジネスである
・ストックビジネス
```
node-webkitでフルスリーン表示するには

# HTML5のフルスリーンAPIが使えない

WebRTCや、WebGLは使えるのにこれは意外でした。

# でも大丈夫

HTML5のAPIで無いのはちょっと残念ですが、ちゃんとAPIが
用意されてます。

# 実装例

```
<!DOCTYPE html>
<html>
    <title>FullScreen Demo</title>
    <h1>FullScreen Demo</h1>
    We are using node.js <script>document.write(process.version)</script>.
<div id="hello"></div>
<button id="play">Full screen</button>
    <script>
    var gui = require('nw.gui');

    var btn = document.getElementById("play");
    btn.addEventListener("click", function () {
      // Get the current window
      var win = gui.Window.get();
      win.enterFullscreen();
    },false);
    window.addEventListener("load",function() {
      var gui = require('nw.gui');
      var win = gui.Window.get();
      win.enterFullscreen();
    });
    </script>
</html>
```

アドレスバー等が黙っていると表示されるので、

以下のような package.jsonで
windowのframeをfalseに指定する。

```
{
  "name": "nw-demo",
  "main": "index.html",
  "window": {
    "frame": false
  }
}
```

## 注意

OSXだと、特にフルスリーンから戻る処理を実装していなくても、OSのメニュー？で戻れますが、プラットフォームによっては困ったことになるかも

# 関連記事

- [node-webkitでGoogle Chartsが使えなかった件](http://kjunichi.cocolog-nifty.com/misc/2014/03/node-webkitgoog.html)
- [Node-webkitで通知センターを使う](http://kjunichi.cocolog-nifty.com/misc/2014/04/node-webkit-5f7.html)
- [node-webkitだけだと出来ないこと](http://kjunichi.cocolog-nifty.com/misc/2014/03/node-webkit-40a.html)
PHP: 連想配列からキーと値の配列を作る [a=>b,c=>d]から[[a,b],[c,d]]


```php
<?php

$assoc = [
	'a' => 1,
	'b' => 2,
	'c' => 3,
];

$array = array_map(function($key, $value){ return [$key, $value]; }, array_keys($assoc), array_values($assoc));

echo json_encode($array);
```

```
[["a",1],["b",2],["c",3]]
```
ruby 三項演算子からの脱却 [そこは || でなんとかなるのでは？]

## はじめに
* これは個人的な話ですが、三項演算子を読むのが苦手です。
* もちろん長くなる場合は、すぐに if 文を使用しますが、三項演算子で十分なときも多々あります。
* しかし、もっと読みやすく書けるのではないか、と考えた結果、これだ！と思ったのでメモします。

* 最初に断っておきますが、ベスト解ではないかもしれません。

## そこは || 演算子でなんとかなるのでは？
* 例として次のコードがあったとします。

```rb:sample.rb
def greet(args)
  hoge = !args[:hi].nil?    ? args[:hi]    : "hoge"
  fuga = !args[:hello].nil? ? args[:hello] : "fuga"
  puts "Hi, #{hoge}"
  puts "Hello, #{fuga}"
end

greet(:hi => "Ruby")
puts "--"
greet(:hello => "Scala")
```

```bash:出力
Hi, Ruby
Hello, fuga
--
Hi, hoge
Hello, Scala
```

* greet というメソッドがあります。
* 引数にハッシュを受け取り、:hi というキーに値が渡された場合は、その文字列を出力し、渡していなければ "hoge" という文字列を出力します。
    * :hello も同様


* しかし、こう書けば読みやすいのではないか？と思ったのが以下です。

```rb:sample.rb
def greet(args)
  hoge = args[:hi]    || "hoge"
  fuga = args[:hello] || "fuga"
  puts "Hi, #{hoge}"
  puts "Hello, #{fuga}"
end

greet(:hi => "Ruby")
puts "--"
greet(:hello => "Scala")
```

* はい、 || 演算子です。
* ruby では false と nil の時、"偽" つまり、条件が成立しません。
* 引数で :hi のキーに値が渡された場合は、右辺の判定はせず、渡した文字列を出力し、渡していない場合は、"hoge" という文字列を出力します。

## 最後に
* すっきりした気がします。どうでしょう？
* "それは常識！"、"そこは、なんか違う！！"などの意見があれば、コメントください。
egencacheでoverlayのemergeを速くする

Portageではツリーごとのメタデータキャッシュを作ることができます。gentooツリーの場合はemerge --syncで一緒に更新されるんですけどね。
これをoverlayでも自分で作っておくことで、emergeする時の依存関係の解決を速くすることができたりします。というお話。

# 前提知識

* laymanで追加したリポジトリがどこに置かれているか知っている
* ローカルリポジトリを使えていれば多分余裕

# あらまし

egencacheというコマンドを実行すると、指定したoverlayのmetadata/md5-cache/以下にebuildのキャッシュを作ります。のでgitとかで管理してたら.gitignoreで除外するといいかも。（著名なoverlayは既にそういう構成になってたりもします）

# cache-formatsの設定

各overlay直下のmetadata/layout.confでキャッシュ形式の指定ができます。

```bash:metadata/layout.conf
master = gentoo
cache-formats = md5-dict # これ
thin-manifests = true
```

が、portage-2.1.11.32以降md5-dictがデフォルトになっているので、指定しなくても同様に動きます。
それ以前はpmsという形式で、更新日時ベースでキャッシュの有効性を判定してしまうので問題になることがあったようです。

# キャッシュの生成

```shell-session
$ sudo egencache --repo=<repo_name> --update --update-use=local-desc
```

ローカルリポジトリをroot以外で管理してるならそのユーザーでもok。
makeでおなじみ--jobsもしくは-jも使えます。

# eix-syncで自動生成

古いキャッシュが混在していても無視されるだけで問題はありませんが、意味がないので自動で生成したいですね。
例えば・・・

```bash:/etc/eix-sync.conf
# overlayの更新
*

# metadataキャッシュの更新
@egencache --repo=<repo_name> --update --update-use-local-desc
```

こんな感じに。
ついでに-Mでemerge --metadataもさせるともうちょっと高速化できたりしますが、お好みで。

# 参考

* [gentoo-haskell overlay](https://github.com/gentoo-haskell/gentoo-haskell)
* man eix （SPEEDUPセクションにもう少し丁寧な説明が）
* man egencache

このエントリの元になった話や所要時間の比較がブログにあるので、こちらもどうぞ。
http://d.hatena.ne.jp/unarist/20140424/1398358540
rake task だけで起きる NameError: uninitialized constant ModelName

完全なる凡ミスが原因なのですが、何故か rake task のみで起きる NameError があったので、レポートします。

## 現象

現象をまとめると

- 開発環境、本番環境共に`rails s`や、`rails c`では `p ModelName` で `ModelName(id: integer,...)` と出力される
- だけど、本番環境だけ`rake task`からそのモデルを直接さわろうとすると ` NameError: uninitialized constant ModelName` で怒られる。
- 開発環境では`rake task`を実行してもエラーにならない。

## 原因

原因は `model_name.rb` が本番環境と、git 上では `Model_name.rb` で保存されていたこと。

そう。多分間違えてファイルを作成したが、Mac はデフォルトでは大文字・小文字の区別が無いため、手元の開発環境では直ってるのに、gitに記録されず、かつ今まで`rake task`からそのモデルを呼び出すことが無かったために気が付かなかった。という問題。

多分開発環境でこの修正やったの1年ぐらい前…

ちなみに普通にファイル名を変更しようと思っても怒られる

```shell-session
➜ git mv app/models/Model_name.rb app/models/model_name.rb
fatal: destination exists, source=app/models/Model_name.rb, destination=app/models/mode_name.rb
```

しかたがないので、一度関係ない名前に変更して、もとに戻す作業が必要でした

```shell-session
➜ git mv app/models/Model_name.rb app/models/FUUUUUUUUUUUCK.rb
➜ git mv app/models/FUUUUUUUUUUUCK.rb app/models/model_name.rb
```

今日はこれに2時間ぐらい悩まされた…辛い…
ちなみにこのミスしたのも俺…
よけいに辛い…
【PHP】DBを使わないで注文番号IDを管理する

わざわざDBに登録するほどではないけれど、注文した商品に対して、
個別のIDを振る必要がある案件があったので備忘録メモ。

大したことしてないけど、また今度使うかもしれないので、こっちに置いときます。

##方法
簡単な話で、注文番号IDをある指定したディレクトリのファイルの中に保存しておいて、
新しく注文があったら、IDを作って追加したり、
通知メールを送るときに、データを読み込んでセットしたりするだけのものです。

注文番号ID・・・fkd-注文年月日-通し番号　という決まりにしました。

##プログラム

注文番号IDをつくる関数と、その注文番号IDをセットする関数をつくりました。

```php
<?php

function makeOrderNum() {

     //ファイル読み込み最新の注文情報取得
     $dp = opendir("order_number") or die('ディレクトリが開けません');
     $fp = fopen("order_number/ordernumber.txt","r") or die("ファイルが開けません");

     while(!feof($fp)){
          $data = fgets($fp);
     }

     $order_array = explode(",", $data);
     $array_num = count($order_array)-1;
     $order_last_array = explode("-", $order_array[$array_num]);
     fclose($fp);

     //注文番号作成
     $date = date('ymd');
     $order_num = '';
     $num = 0;
     
     if($order_last_array[1] == $date) {
          $num = $order_last_array[2];
          $order_num = 'fkd-'.date('ymd').'-'.($num+1);
     } else {
          $order_num = 'fkd-'.date('ymd').'-'.$num;
     }

     //新規注文番号を追加登録
     $fp = fopen("order_number/ordernumber.txt","a");
     fputs($fp, $order_num.',');
     fclose($fp);
}

?>

```

```php
<?php

function setOrderNum() {

     $num = 0;
     //ファイル読み込み最新の注文情報取得
     $dp = opendir("order_number") or die('ディレクトリが開けません');
     $fp = fopen("order_number/ordernumber.txt","r") or die("ファイルが開けません");

     while(!feof($fp)){
          $data = fgets($fp);
     }

     $order_array = explode(",", $data);
     $array_num = count($order_array)-1;
     fclose($fp);
     
     $order_last_array = explode("-", $order_array[$array_num]);
     $num = $order_last_array[2]+1;
     $order_num = $order_last_array[0].'-'.$order_last_array[1].'-'.$num;

     return $order_num;
}

?>

```

以上になります。

特にPHPは習いたてなので、無駄な処理・スマートじゃない処理に対する
ご指摘をいただければ、喜びますので心優しい方、よろしくお願いします。
ClojureでAES暗号化をしてみる＆AESのちょっと細かい話

ClojureでのAES暗号化するコードを作ってみました。
Javaの標準ライブラリを使ってできるのでそんなに難しくないですね。

```aes.clj
(import '[java.security SecureRandom Key]
        '[javax.crypto KeyGenerator Cipher]
        '[javax.crypto.spec IvParameterSpec]
        '[java.security.spec AlgorithmParameterSpec])

(defn ^bytes rand-bytes [n]
  (let [b (byte-array n)]
    (.. (SecureRandom.) (nextBytes b))
    b))

(defn ^Key aes-genkey [^long bits]
  {:pre[(#{128 192 256} bits)]}
  (let [kg (KeyGenerator/getInstance "AES")]
    (.init kg bits)
    (.generateKey kg)))

(def ^:dynamic *aes-mode* "AES/CBC/PKCS5Padding")

(defn- ^bytes aes-*code [^long mode ^bytes bytes ^Key key ^AlgorithmParameterSpec spec]
  (let [c (Cipher/getInstance *aes-mode*)]
    (if spec
      (.init c mode key spec)
      (.init c mode key))
    (.doFinal c bytes)))

(defn ^bytes aes-encode [^bytes bytes ^Key key & [^AlgorithmParameterSpec spec]]
  (aes-*code Cipher/ENCRYPT_MODE bytes key spec))

(defn ^bytes aes-decode [^bytes bytes ^Key key & [^AlgorithmParameterSpec spec]]
  (aes-*code Cipher/DECRYPT_MODE bytes key spec))
```

使い方はこんな感じで

```clj
(def k (aes-genkey 128))
(def iv (rand-bytes 16))
(def encoded (aes-encode (byte-array 2) k (IvParameterSpec. iv)))
(def decoded (aes-decode encoded k (IvParameterSpec. iv)))

(binding [*aes-mode* "AES/ECB/NoPadding"] 
  (let [e (aes-encode (byte-array 16) k)]
    (seq (aes-decode e k))))
```

`*aes-mode*`には以下のものが指定できるようです。

* AES/CBC/NoPadding
* AES/CBC/PKCS5Padding
* AES/ECB/NoPadding
* AES/ECB/PKCS5Padding 

CBCはAES鍵は同じでも暗号化のたびにIV(Initialization Vector)を変えることで、同じ平文でも異なる暗号文にする方式です。復号する側には暗号化のたびにIVを教える必要があります。
ECBでは鍵が同じなら同じ平文には同じ暗号文が出力されるので、暗号強度は弱くなります。

NoPaddingは平文がAESのブロック長である16バイトの倍数であると確定している場合にのみ使えます。16の倍数でない場合は例外が発生します。
PKCS5Paddingは平文が16バイトの倍数であるとは限らない場合に使います。（方式としてはバイト数を16で割った余りが1のときは0x0fを15バイト追加、余りが2のときは0x0eを14バイト追加、余りが15のときは0x01を1バイト追加、そして余りが0のときは0x10を16バイト追加します）

※なお、正式な名称としてはPKCS#7 Paddingとなるようです。PKCS#5 PaddingはDESの頃のブロック長が8バイトのときの名称とのこと。Bouncy CastleではPKCS7の名称になっていたと思います。
※ちなみに、復号の際にPadding関連の例外が発生した場合、Paddingの誤りではなく復号の失敗（鍵、IVの誤り）であるケースがほとんどです。

AESの鍵長はOracle JDKではデフォルトでは128ビットしか使えません。192, 256ビットで使いたい場合はJava Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Filesをダウンロードしてjre/lib/securityに配置（上書き）する必要があります。
この処置を行わないと`java.security.InvalidKeyException: Illegal key size`のような例外が発生します。
[一日一Vim](その10)globalコマンド

# 参考サイト

http://vimmer.blog5.fc2.com/

http://qiita.com/0829/items/6df968408d52b949aac0

http://nanasi.jp/articles/howto/editing/global-head.html

# global コマンド

`:g/{検索語句}/{コマンド}`という形で使用するようです。
`{検索語句}`にヒットする行に対して`{コマンド}`が実行できるようになるようです。
`:g//d`で直前に検索した文字を含む行を削除できるようです。
`:g//m$`で直前に検索した文字を含む行を末尾に移動する。という動作になるようです。
いったいどういう時にメリットがあるのか不明ですが、コマンド部分を変えると、色々できそうだなぁと感じました。

また、[VIM達人への道](http://vimmer.blog5.fc2.com/)さんの、検索行の数値をインクリメントするというコマンドは私は以外と使うので、重宝しそうだなぁと思います。

# 雑談

`vim 上達` で調べると、先人方のありがたいサイトがヒットして嬉しい限りです。行くサイト行くサイトで感心することばかりです。vimは奥が深いですね。
何でも電話してくる会社

レガシーなシステムの移行のために綱渡りしてる時や、10分で不具合を解消しなければならない時に、全然別案件の緊急じゃない用事で電話がかかってくると、キレそうになりますよね。そーゆー電話する人に限って、無駄な会議を設定したり、全然違うものを上げてきたり、残念な相関を示すのも興味深いところです。

個体差はあるものの人間の注意力は有限の資源です。他人の貴重な資源を簡単にムダにしてしまうのが、電話の恐ろしいところですね。今は、F2Fや電話以外にもコミュニケーションの方法は多様にあるので、使い分ければいいのですが、それを社会に提供するIT企業においてすら、何でもかんでも電話してくる人がいます。人というより、その会社の仕事のやり方、文化なんだなと思うケースが多いです。

電話

* 情報交換のイテレーションがもっとも速い
* 相手の資源を強制的に占有する
* 3人以上の情報共有が出来ない
* 内容が残らない
* 相手が電話機の前にいないと連絡取れない

メール

* 相手は事情に合わせて対応するタイミングを選べる
* やりとりの内容が残る
* 同報できるので情報共有が容易
* 情報交換のイテレーションが遅い
* 手紙のメタファを有するため儀礼的な態度を求められることが多い

チャット

* 情報交換のイテレーションが速い
* 相手は事情に合わせて対応するタイミングを選べる
* やりとりの内容が残る
* 同報できるので情報共有が容易
* カジュアルに運用することが多い

基本はチャット、チャットで間に合わないぐらいの緊急時のみ電話、で良いと思うんですよね。

製品を複数の顧客に提供して、1対多の関係になってる時、CRMっぽい仕掛けはすごく役に立ちます。顧客とのやりとりを通じて、ユースケースや問題点が蓄積されていきます。日々の連絡と対応が集積されて、次に何をすべきか考えるデータになります。一方、電話やメールのやりとりは、いちいち全部、手で集約してられないです。仕事のやり方のレベルが違ってきます。

なので、何でも電話してくる会社と仕事するのは、コストもかかるし要注意だなあという話でした。
up.shを書いた

[up.sh](https://github.com/sasaplus1/up.sh)

既にありそうな感じだったけど、最近シェルスクリプトを書く事も少なくなって来ていたので、リハビリがてら？久しぶりに書いてみた。

どういうスクリプトかというと

```bash:Terminal
$ pwd
/foo/bar/baz/qux/quux
$ up 3
$ pwd
/foo/bar
```

とまあ、`up`のあとに引数として数字を渡すと、その数だけ上に移動したりする。

```bash:Terminal
$ pwd
/foo/bar/baz/qux/quux
$ up az
$ pwd
/foo/bar/baz
```

`up`のあとに文字列を渡すと、カレントディレクトリから引数でgrepして、一番近い位置に移動する。上記の例の場合は`az`でgrepして`baz`のところに一致しているので`/foo/bar/baz`に移動してる。

なんか妙に階層が深いリポジトリが多くて、移動が大変だったので書いた。玄人なら`pushd`とか`popd`を使うのかもしれないけど……

[z](https://github.com/rupa/z)とあわせて便利に使ってます。