OmniAICreator/Qiita-1.07M huggingface dataset:
Hololens 開発環境の構築とエミュレータでGalaxy Explorerをとりあえず動かす

# 環境構築に必要な情報収集

Hololensでアプリを作るために必要な開発環境を整えていきたいと思います。
## 参照サイト
必要なアプリについてはMSの公式サイトに記載。
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

Galaxy Explorerについてはgit hubでソースが公開されているので取得しておきます。
https://github.com/Microsoft/GalaxyExplorer

## 今回の環境とバージョン
- Windows 10 Pro
    - 有効にする機能
        - .NET Framework 3.5
        - Hyper-V  
- Visual Studio Community Edition 2015 update 3
- Hololens Emulator 10.0.14393.0
- Unity 5.5.1f1
- vuforia 6.2
- Windows 10 SDK 

Hololens EmulatorについてはWindows 8.1の64Bit環境ではエラーで起動しませんでした。
ビルドなどは正常に行えますので実機があればWindows 8.1でも開発可能です。

# セットアップ
セットアップ自体は以下の順にインストールしました。
1. Visual Studio
2. Windows SDK
3. Hololens Emulator
4. Unity
5. vuforia
unityについてはプロキシ環境ではセットアップに失敗します。プロキシの利用が必須な組織であれば、アーカイブからダウンロードすることで対応可能ですが、pluginを手に入れる際には環境変数に以下の情報を設定しプロキシ経由での利用が必要になります。
- キー：HTTP_PROXY
- 値：http://&lt;IPアドレス&gt;:&lt;ポート番号&gt;

# ビルドから実行まで
基本的な手順はGalaxy Explorerのgithubに説明があります。ここでの作業も同じ手順で進めています。
## Unityでの作業
1.Unityを起動します。
Galaxy Explorer自体はUnity 5.5.0f3で作成されているようでこのような警告がでてきますが、「continue」で次へ。

![u1.png](https://qiita-image-store.s3.amazonaws.com/0/152548/e67fb70f-dd3f-9f96-ee6c-187385a2e49c.png)

画面が上がってきたら「File」-「Build Settings」を選択し、ビルド設定画面を立ち上げます。
![u2.jpg](https://qiita-image-store.s3.amazonaws.com/0/152548/ddad13f9-59ca-7f2d-424d-2a2145250b54.jpeg)
以下の部分を設定してビルドを実行します。出力先はGalaxyExplorer/UWPフォルダに設定します。

- Scenes In Build：すべて選択
- Platform：Windows Store
- SDK：Universal 10
- Copy Referencesにチェック
- Unity C# Projectsにチェック

## Visual Studioでの作業
GalaxyExplorer/UWP内のGalaxyExplorer.slnを開きVisual Studioを起動します。
Visual Studioは管理者モードで起動します。
事前に「Hyper-V Virtual Machine Management」サービスが実行されているかの確認も。

1. 構成を「Debug」「X86」で設定しソリューションのビルドを実行します。
2. プロジェクトを「GalaxyExplorer」エミュレータに「Hololens Emulator 10.0.14393.9」を選択してソリューションの配置を実行

エミュレータ上にアプリケーションが展開されます。
![v1.png](https://qiita-image-store.s3.amazonaws.com/0/152548/87053172-59f6-0a01-4949-8212af9f16b9.png)

配置されたアプリはメニューの中に追加されていますので選択することで
起動できます。

以上でとりあえず動かすことができました。
UnityでSocialAPIを使う際の注意事項

## はじめに
UnityでLeaderboardを実装するためのSocialAPIを利用したのですが、気をつけないと不具合につながるケースがありました（というか進行不能の不具合をだしてしまいました）

## 環境
Unity： `５．５．０f3`
ターゲット: `iOS9以上`
`※Androidでは試していません`

## はまったのは認証API
こちらのドキュメントにあるように、認証したら成否を引数にコールバックを呼んでくれます。
https://docs.unity3d.com/ja/current/ScriptReference/Social-localUser.html

こんな感じですね。

```C#
public class SocialExample : MonoBehaviour {
    
    void Start () {
        Social.localUser.Authenticate (ProcessAuthentication);
    }

    void ProcessAuthentication (bool success) {
        if (success) {
            Debug.Log ("Authenticated");
        }
        else
            Debug.Log ("Failed to authenticate");
    }
}

```
とても簡単で便利ですね！
ただしよーくドキュメントを読むと次のページに注意書きがあります。
https://docs.unity3d.com/ja/current/ScriptReference/SocialPlatforms.ILocalUser.Authenticate.html

> 特定のプラットフォームではプログラムを 1 つ実行中に関数を呼び出すと、ユーザーや OS が認証するための最初の試みをキャンセルした場合、2 回目以降のコールバックが起動しない場合があります。

ふむふむ。認証画面を何度もださないようにプラットフォーム側が工夫しているんでしょうかね。

**つまり２回以上呼び出さなきゃいいんだな** と考えて、ローディングページで認証APIを呼んでコールバックを待つ実装にしていたのですが、**1回目でもコールバックが返ってこない**ケースが発生していました。つまりローディングページから先に進めなくなるという致命的な不具合に。。。

自分の手元では起きていなかったので、リリース後にユーザーさんからの報告で気づきました。しばらくGameCenterまわりをさわっていない端末で起こっていそうです。
原因はよくわかっていないのですが、下記のような状況になっていました。

- 認証APIのコールバックが返ってこないケースがある
- それでもSocial.localUser.authenticatedはtrueを返す
- その状態でリーダーボードを開くと、「データを読み込めません。」と表示される


いずれにせよ、
**Social.localUser.Authenticateのコールバックを待つような実装をしてはいけない**
ということですな:persevere:


## 今回のアプリは絶賛配信中です（もちろん不具合解消済み:stuck_out_tongue_winking_eye:）

[![動画](http://img.youtube.com/vi/d84vL9UgOBc/0.jpg)](http://www.youtube.com/watch?v=d84vL9UgOBc)

配信：
iOS: https://itunes.apple.com/jp/app/id1189800250
Android: https://play.google.com/store/apps/details?id=com.keepgamesimple.rollingsphere
Mac での MySQL セットアップ

# インストール
```
$ brew install mysql
```

# コマンド一覧
```
$ mysql.server

Usage: mysql.server  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]
```

# 状態確認
```
$ mysql.server status
```

# 起動
```
$ mysql.server start
```

# 停止
```
$ mysql.server stop
```

# リロード
```
$ mysql.server reload
```

# 再起動
```
$ mysql.server restart
```

# ログイン例
```
$ mysql -uroot
```

ここは Mac 関係ないので、公式マニュアルを見たほうが幸せになれそう。
[MySQL :: MySQL 5\.6 リファレンスマニュアル :: 4\.5\.1\.1 mysql のオプション](https://dev.mysql.com/doc/refman/5.6/ja/mysql-command-options.html)

# 環境
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1314

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for osx10.12 (x86_64) using  EditLine wrapper
```

[sw\_vers\(1\) Mac OS X Manual Page](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sw_vers.1.html)
[mysql – Homebrew Formulae](http://formulae.brew.sh/formula/mysql)

# 所感
- サーバーで作業することが多いとよく忘れるので備忘録

EOF
【Java】可変長引数のパラメータを配列にするときの注意

リフレクションとか、JMockitのDeencapsulationとかをいじってるときに気をつけてないと結構はまるポイントになる気がするのでまとめました。

# とりあえずいろんなパターンで動かす

```java:Main.java

public class Main {

    public static void main(String[] args) {

        // 1
        test(1, "a", "b", "c");

        // 2
        test(2, new String[] { "a", "b", "c" });

        // 3
        test(3, new String[] { "a", "b", "c" }, "d");

        // 4
        test(4, new int[] { 1, 2, 3 });

    }

    private static void test(int number, Object... args) {

        System.out.println("No." + number + " length = " + args.length);

    }

}
```

可変長引数のパラメータにいろんなパターンで値を渡して、受け取ったパラメータのサイズを出力しています。
コンソールにはどう出力されるでしょうか？

## 出力結果

```:コンソール
No.1 length = 3
No.2 length = 3
No.3 length = 2
No.4 length = 1
```

## 解説

可変長引数の定義の実態が配列であることを意識し、コンパイル時にどんな形になるかを考えると分かりやすい。

受け取り側はコンパイル時に下記引数を持つメソッドに変換される。

```java
private static void test(int number, Object[] args) {
    ...
}
```

### No.1

コンパイル時に受け取り側の配列に変換される。

```java
test(1, new Object[]{"a", "b", "c"});
```

サイズは3となる。

### No.2

すでに配列で共変なため、変換が行われない。

```java
test(2, new String[]{"a", "b", "c"});
```

サイズは3となる。

### No.3


コンパイル時に受け取り側の配列に変換される。

```java
test(3, new Object[] { new String[] { "a", "b", "c" }, "d" });
```

サイズは2となる。

### No.4


すでに配列だが、プリミティブ型の配列はそのままObjectの配列にキャストすることが出来ないので、コンパイル時にObjectの配列に包まれた状態に変換される。

```java
test(4, new Object[] { new int[] { 1, 2, 3 } });
```

サイズは1となる。

# あとがき

- No.2で配列自体を1つのデータとして渡したい場合は以下のように明示的にキャストをすると実現出来る。

```java
//No.2 length = 1
test(2, (Object) new String[]{"a", "b", "c"});
```

- 変な動きをして困ったら逆コンパイル(java → class → java)してみるといいかもしれない。
java8対応の逆コンパイラはCFR, FernFlower, Procyonとかあってなんかいろいろ特徴があるみたいです　→　いつか記事にしたい
特定のワードを拾って復唱し、そのユーザーをフォローするtwitter bot

特定のワードのところは適当に変えて下さい
RTと@,#,リンクが含まれるツイートは無視しています。
起動はcronで。

twitterauthが必要です。
https://github.com/abraham/twitteroauth

$ composer require abraham/twitteroauth

```php
<?php
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
define(CONSUMER_KEY, '');
define(CONSUMER_SECRET, '');
$access_token = '';
$access_token_secret = '';
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);
$content = $connection->get("account/verify_credentials");
$tweet = $connection->get("search/tweets", array("q" => "特定のワード -RT -to:@* -#* -filter:links", 'count' => 1));
$id = $tweet->statuses[0]->user->id;
$rep = $tweet->statuses[0]->text;
$name = $tweet->statuses[0]->user->name;
$pos = strpos($rep,"@");
if($pos == 0) $rep = mb_substr($rep, strpos($rep," "));
if(empty($rep)) $rep = "No tweets found";
$statues = $connection->post("statuses/update", ["status" => $rep]);
$params = array(
    'user_id' => $id,
    //'screen_name'=>"",
    'follow'=> 'true',
);
$addFriend = $connection->post("friendships/create", $params);
```
SQLアンチパターン：スパゲッティクエリ

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- SQL クエリの数を減らす

# アンチパターン

- 複雑な問題をワンステップで解決しようとする
  - デカルト積の発生
  - https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88
- 1つのクエリで複数のことをやろうとすると
  - 変更、修正、デバッグが難しい
  - 実行に時間がかかる

## 用いてもいいパターン

- フレームワーク、BIツールを使う時

# 解決策

分割統治を行う
   - まったく同じ予測をする 2 つの競合する理論があるときは、単純な方が優れている
- クエリ分割は
  - 開発、メ ンテナンス、パフォーマンスなどの面で様々なメリット
- UNION を使う
- CASE式とSUM関数を使う

# まとめ

1つのSQLでやろうとせずに、状況に応じて分割することも考える

# 感想

すごく長いSQL見かける...
ActiveRecord を上手く使おう

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
Symfony 2.x で CSRF対策


どこでハンドリングされるのかは未調査ですが、Form を利用すると設定しておけば自動的に（？）CSRF対策されるそうですが、Form の使い勝手が悪いというか、ある程度テンプレート側に任せたいので token の生成と検証のメソッドを Controller の基底クラスに用意します。

生成した token を hidden で埋め込んで、action で検証という自前実装に使えます…

下記のコードは [AppLogger](http://qiita.com/R-STYLE/items/f9f9782dcd070b1d2369) を利用しています。

```php:AppBundle/Controller/AbstractController.php
<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\DependencyInjection\Logging\AppLogger;

abstract class AbstractController extends Controller {

    // Generate token.
    protected function generateCsrfToken($tokenType) {
        $token = $this->get('security.csrf.token_manager')->refreshToken($tokenType);
        if (AppLogger::isDebugEnabled()) {
            $name = get_class($this);
            $name = substr($name, strrpos($name, '\\') + 1);
            $logger->debug('[' . $name . '][CSRF Token][Gen] ' . $tokenType . ' => ' . $token);
        }
        return $token;
    }

    // Validate token.
    protected function isValidCsrfToken($tokenType, $token) {
        // If current is the master, getParentRequest() returns null.
        if ($this->get('request_stack')->getParentRequest()) {
            // from forward, always valid. (Usualy forward is SUB_REQUEST)
            return true;
        }
        if (AppLogger::isDebugEnabled()) {
            $name = get_class($this);
            $name = substr($name, strrpos($name, '\\') + 1);
            AppLogger::debug('[' . $name . '][CSRF Token][Req] ' . $tokenType . ' => ' . $token);
        }
        return $this->isCsrfTokenValid($tokenType, $token);
    }
}
```
Symfony 2.x で static な logger を用意する


標準の logger は service container に登録されているので、毎回コンテナから取得する手間があったり、ちょっとしたユーティリティクラス等で利用しにくいので、AppBundle 配下で static に利用できるようにします。

## Loggerを用意

まずは static な logging メソッドを持つクラスを用意。
 
ついでに、ログレベルの判定で、利用クラス側で Monolog\Logger を参照させないために、isHandling() もラップしておきます。

```php:AppBundle/DependencyInjection/Logging/AppLogger.php

<?php

namespace AppBundle\DependencyInjection\Logging;

use Psr\Log\LoggerInterface;
use Monolog\Logger;

class AppLogger {

    private static $logger;

    private function __construct() {
    }

    // ここは Monolog\Logger で良いが、なんとなく…
    public static function configure(LoggerInterface $logger) {
        self::$logger = $logger;
    }

    public static function getLogger() {
        return self::$logger;
    }

    public static function isDebugEnabled() {
        return self::$logger->isHandling(Logger::DEBUG);
    }

    public static function isInfoEnabled() {
        return self::$logger->isHandling(Logger::INFO);
    }

    public static function isWarnEnabled() {
        return self::$logger->isHandling(Logger::WARN);
    }

    public static function isErrorEnabled() {
        return self::$logger->isHandling(Logger::ERROR);
    }

    public static function isAlertEnabled() {
        return self::$logger->isHandling(Logger::ALERT);
    }

    public static function debug($message, array $context = array()) {
        return self::$logger->debug($message, $context);
    }

    public static function info($message, array $context = array()) {
        return self::$logger->info($message, $context);
    }

    public static function warn($message, $ex = null) {
        $context = self::assignException($ex);
        return self::$logger->warning($message, $context);
    }

    public static function error($message, $ex = null) {
        $context = self::assignException($ex);
        return self::$logger->error($message, $context);
    }

    public static function alert($message, $ex = null) {
        $context = self::assignException($ex);
        return self::$logger->alert($message, $context);
    }

    private static function assignException($exception, $context = array()) {
        if ($exception !== null && $exception instanceof \Exception) {
            $context['exception'] = $exception;
        }
        return $context;
    }
}
```

## AppBundle で初期化

AppBundle でラップする logger を設定します。
これで `AppLogger::info('info');` のように利用できるようになり、サービスコンテナから取得する手間が省けます。

```php:AppBundle\AppBundle.php
<?php

namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use AppBundle\DependencyInjection\Logging\AppLogger;

class AppBundle extends Bundle {

    public function boot() {
        parent::boot();
        // 標準のロガーを利用する場合
        AppLogger::configure($this->container->get('logger'));
    }
}


```
Raspberry Pi 2にWLI-UC-GNMを挿してsshするまで

最初は有線に繋がないとイケないと、なぜか勘違いをしておりましたが、ふつうに繋げます。
RPi2のModel BにBUFFALOのWLI-UC-GNMを挿してます。

```sudo nano /etc/wpa_supplicant/wpa_supplicant.conf```
で設定ファイルを編集し、下記のような状態にします。それだけ。
```ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid=”SSIDの名前”
psk=”パスワード”
}
```
そもそもWiFi届いてんの？という確認は下記。
```sudo iwlist wlan0 scan```

confに余計なことを書くと動かなかったりしたので、意味不明なものは足さないようにしましょう。

繋がったら、```sudo raspi-config```でsshをenableします。後はipの確認ですが
```hostname -I```とコマンドを打つと、ipが返ってきます。戻ってきたipを@の後ろにつけて、下記のようにsshします。初期パスワードはraspberry
```ssh pi@192.168.1.15```

ちなみに、シャットダウンは
```sudo shutdown -h now```
電源を抜いてまた挿すとまた起動します。
PHPでFacebook認証

随分躓いたFacebook認証。
何より、ググっても言語やversion等環境が違う記事が多く、詳細が分かってないと対処できない。こういう時は本を買って丸コピするのが得策だが、それもなんか見つからない。

斯く斯く然々で、出来たのでメモっておく。
ログインボタンが置いてあるページからリダイレクトされるphpファイルを書きます。ログインしないと入れないかどうかは分岐で調整してください。

```php

session_start(); //サーバ側で保存する情報$_SESSIONを使用します宣言

if(empty($_GET[‘code’])){ //初めてこのページに来た人は?code=が空なので以下の処理を実行
 $_SESSION[‘state’] = sha1(uniqid(mt_rand(), true)); //乱数な接頭辞を付けたユニークIDをハッシュ化して予測不能な値を作る
 $params = array(
  ‘client_id’ => ‘FacebookアプリID’,
  ‘redirect_uri’=> ‘http://xxx.com/redirect.php’, //このファイルの場所
  ‘state’ => $_SESSION[‘state’], //sessionにも入れた予測不能な値を入れる
  ‘scope’ => ‘public_profile,user_friends,email’ //Facebookから取得したいもの、申請しないで取得できるのは左記3つ
 );
 $url = "https://www.facebook.com/dialog/oauth?".http_build_query($params); //このあとぶっとぶAPIのURL準備
 header(‘Location: ‘.$url); //飛ぶ
 exit; //飛ばした場合はここで終了。戻ってきたときは?code=が空でないのでelseに分岐する
}
else{ //$_GET[‘code’]が空ではない場合
 if($_SESSION[‘state’] != $_GET[‘state’]){
 echo "不正アクセスの可能性があるので終了"
exit;
}
$params = array(
‘client_id’ => ‘FacebookアプリID’,
‘client_secret’ => ‘FacebookアプリSecret’,
‘code’ => $_GET[‘code’], //戻ってきたコード
‘redirect_uri’ => ‘http://xxx.com/redirect.php’ //このファイルの場所
);
$url = ‘https://graph.facebook.com/oauth/access_token?’.http_build_query($params); //apiのurlにparamsをくっつけて渡す
$body = file_get_contents($url); // access_token=xxxx みたいに返ってくる
parse_str($body); //パースして$access_tokenつくる
$url = ‘https://graph.facebook.com/me?access_token=’.$access_token.’&fields=name,picture,email’; //トークンを渡して、名前、プロフィール画像、メアドを取得
$me = json_decode(file_get_contents($url)); //jsonで返ってくるのでデコード

try { //データベースに接続（DB事前準備は割愛）
 $dbh = new PDO(‘mysql:host=localhost;dbname=データベース名,ユーザー名,パスワード);
} catch(PDOException $e){
 echo $e->getMessage();
 exit;
}
//新規ユーザーかどうかFBIDを使って確認
$stmt = $dbh ->prepare("select * from users where facebook_user_id=:user_id limit 1");
$stmt->execute(array(":user_id"=>$me->id));
$user = $stmt->fetch();

if(empty($user)){ //新規ユーザーなら登録
 $stmt = $dbh->prepare("insert into users (facebook_user_id, facebook_name, facebook_picture, facebook_access_token, created, modified, facebook_email) values (:user_id, :name, :picture, :access_token, now(), now(), :email);");
 $params = array(
 ":user_id"=>$me->id,
 ":name"=>$me->name,
 ":picture"=>$me->picture->data->url,
 ":access_token"=>$access_token,
 ":email"=>$me->email
);
$stmt->execute($params);
$stmt = $dbh->prepare("select * from users where id=:last_insert_id limit 1");
$stmt->execute(array(":last_insert_id"=>$dbh->lastInsertId())); //最後に挿入されたIDのユーザー名
$user = $stmt->fetch();
}
if(!empty($user)){ //ちゃんと登録済を確認できたor新規登録できた場合
 session_regenerate_id(true); //元々のsessionを消して新しく生成
 $_SESSION[‘user’] = $user;
 header(‘Location: 戻したいページ);
}

```
(初心者向け) プロビジョニングプロファイルにデバイスを追加

# はじめに
OSのバージョン違いテストなどのために、複数のiPhoneをテストに利用する場合があるかと思います。ここでは既に作成した開発用プロビジョニングプロファイルにデバイスを追加する手順を行います。

なお、プロビジョニングプロファイルの変更、作成はApple Developers Programで管理者権限が必要です。
https://developer.apple.com/support/roles/jp/

# 新しいデバイスの追加
以下を参考にデバイスを追加して下さい
http://qiita.com/yokobonbon/items/7cbef84c852a6f221ac0#%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E7%99%BB%E9%8C%B2

なお99デバイスの制限があるため、むやみにデバイスを追加しない方が良いです。いつでも消せる方が良いと思うのですが、現状は、Apple Developers Programの1年に1度の更新タイミングでのみリセットできるようです。
http://www.sachostore.com/2014/01/100udid-ios-dev-center.html

# プロビジョニングプロファイルの更新
Apple Developers Programから既にある作成済みのプロビジョニングプロファイルを選択してEditを押す。
![スクリーンショット 2017-01-28 10.59.00.png](https://qiita-image-store.s3.amazonaws.com/0/85182/64f50f00-87cb-4a63-4947-44a5b74245be.png)

新しいデバイスを追加

![スクリーンショット 2017-01-28 10.59.32.png](https://qiita-image-store.s3.amazonaws.com/0/85182/755eb5b3-fe0f-df9e-9d9e-921c2b4a5ecd.png)

# Xcodeで再ビルド
Xcodeを起動して、プロビジョニングプロファイルが対応付けられたアプリケーションを再ビルドします。iPhone4Sを追加した関係で、OSのバージョンを8.2に選択して再度ビルドしました。

![スクリーンショッ17-01-28 11.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/85182/69ac0895-1fc9-140e-526d-2e92baa75b0f.png)

新しいデバイスをUSB接続すると無事動作しました。
PHPのファイル読み書きで社畜からの開放


N行にわたるビッグデータ()の全ての行にタグを貼っていく簡単なお仕事…

を振られた時に、高等社畜は「1タグ貼るのにT秒かかるから、作業時間はNTですね（ﾄﾞﾔ」
と言って徹夜作業を始めますが、これはNTではなくNGです。

セキュリティの観点から会社のPCにプログラムは入れられない…我々には膨大な人的リソースが（余って）いるから手を動かせ！という大企業、プライスレス…

余談はこれくらいにして、全ての行に<span translate></span>タグを差し込むサンプルを載せます。

余談ですが、海外システムの翻訳とかやったことある方はpoedit（translateタグを差し込んだ箇所を翻訳するソフト）をやりながら、英語が分からないだけで業務が１つ生まれてしまう日本を憂んだことがあると思います。それでお給料が貰えてしまう自分、プライスレス…

 

```
<?php
$fp = fopen(‘input.txt’, ‘r’); //元のファイル。rは読みますという意味。
if ($fp){
if (flock($fp, LOCK_SH)){
while (!feof($fp)) {
$buffer = rtrim(fgets($fp));
$array[] = ‘<span translate>’.$buffer.'</span>’; //タグではさむ
}
flock($fp, LOCK_UN);
}else{
print(‘ファイルロック失敗’);
}
}
$flag = fclose($fp);

if ($flag){
print(‘クローズ成功’);
}else{
print(‘クローズ失敗’);
}

$fp = fopen(‘output.txt’, ‘ab’); //出力するファイル。abは書きますという意味。

if ($fp){
if (flock($fp, LOCK_EX)){
foreach($array as $row):
if (fwrite($fp, $row."\n") === FALSE){
print(‘書き込み失敗’);
}else{
print(‘書き込み成功’);
}
endforeach;
flock($fp, LOCK_UN);
}else{
print(‘ファイルロック失敗’);
}
}
fclose($fp);
```
[Emacs] ファイルパスからファイルを開く

## 目的

例えば以下のようなコンパイルエラーに表示されたファイルを開きたい

```
** (CompileError) test/controllers/user_controller_test.exs:9: undefined function user_path/2
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/code.ex:370: Code.require_file/2
    (elixir) lib/kernel/parallel_require.ex:57: anonymous fn/2 in Kernel.ParallelRequire.spawn_requires/5
```

`M-x compile`などで実行した場合は`C-m`で飛べたりもするが、そうじゃない場合。

## 方法

標準で搭載されている[FFAP](https://www.gnu.org/software/emacs/manual/html_node/emacs/FFAP.html)を使う。
目的のファイルパスにカーソルを合わせて`M-x ffap`とすればよい。

init.elで

```elisp
(ffap-bindings)
```

を定義しておけば`C-x C-f`などをよろしく`M-x ffap`等に置き換えてくれる。

追記: `C-x d`の挙動などがhelmと相性が良くなかったので

```elisp
(global-set-key (kbd "C-x C-f") 'ffap)
```

だけ設定するようにした。

### 相対パスがうまく検索できないとき

FFAPは相対パスの場合はカレントディレクトリから検索を行うため、カレントディレクトリがズレていると検索してくれない。
その場合は`M-x cd`でカレントディレクトリを変えてしまうのが手っ取り早い。
サルでも分かるPHP goutteでスクレイピング

```curl -sS https://getcomposer.org/installer | php```

↑composer.phar ダウンロード

```php composer.phar require fabpot/goutte:~2.0```

↑goutteインストール。vendorディレクトリが生成される。composer.jsonに下記が記述される。

```{
"require": {
"fabpot/goutte": "~2.0"
   }
}```

下記の通りphpファイルを作成。
http://xxx.com/1 から http://xxx.com/100 まで100ページに渡り、<div class=”classname”></div>に囲まれた部分を拾ってくる。
アウトプットはターミナルに表示されるが、```php filename.php > text.txt``` などで保存可。

```
<?php
require_once ‘./vendor/autoload.php’; //goutte呼ぶ

$client = new Goutte\Client();
for($i=1;$i<100;$i++){ //100ページまで読む
$crawler = $client->request(‘GET’, ‘http://xxx.com/’.$i); //読みたいサイト

// 抽出
$target/*Selector*/ = ‘div.classname’; //拾う場所。この例だと<div class="classname">ここを拾ってくる</div>
$crawler->filter($target)->each(function ($node) {
$word = $node->text();
echo $word . "\n"; //ターミナルに表示
});
}
```

色々と応用できますね（邪
【問題解決】SAXReader：外部のDTDファイルが指定されたxmlファイルを、オフライン環境で読み込む方法



# 環境

* [org.dom4j.io.SAXReader](https://dom4j.github.io/javadoc/1.6.1/org/dom4j/io/SAXReader.html)

```xml:pom.xml
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.1</version>
</dependency>
```


# やりたいこと

以下のような、外部のDTDファイルが指定されたxmlファイルを、`org.dom4j.io.SAXReader`で読み込みたいです。
ただし、オフライン環境で読み込みたいです。


```xml:struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
...
</struts-config>
```

# 問題

以下のコードをオフライン環境で実行したら、`UnknownHostException`が発生しました。

```java:Bad.java
SAXReader reader = new SAXReader();
Document doc = reader.read("struts-config.xml");
```


```txt:Exception
org.dom4j.DocumentException: jakarta.apache.org Nested exception: jakarta.apache.org
	at org.dom4j.io.SAXReader.read(SAXReader.java:484)
	at org.dom4j.io.SAXReader.read(SAXReader.java:321)
	at test2.Test2.main(Test2.java:24)
Nested exception: 
java.net.UnknownHostException: jakarta.apache.org
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    ～～～
```

# 原因

原因は、DOCTYPE宣言に指定されたdtdファイルが読み込めないからです。
外部のDTDファイルを読み込まないようにすれば、解決しました。


```java:Good.java
SAXReader reader = new SAXReader();
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document doc = reader.read("struts-config.xml");
```

# 参考サイト
https://xerces.apache.org/xerces2-j/features.html
http://qiita.com/yoshi389111/items/3d0da72b1f2ccd947052
http://k-motohashi.hatenablog.com/entry/2013/04/24/115413
PHPのmail関数mb_send_mail関数でAWSからメールを配信（メルマガ作成用）

AWSからPHPを使ってメール配信します。
#まず、一番シンプルにmail関数で

```
$headers = ‘From: ‘. ‘sender@hoge.com’ . “\r\n” .
‘Reply-To: ‘.sender@hoge.com’ . “\r\n” .
‘Return-Path: ‘.sender@hoge.com’ . “\r\n” .
‘X-Mailer: PHP/’ . phpversion(); //改行してOK
mail(‘receiver@hoge.com’, ‘タイトル’ , ‘本文’ , $headers, ‘-f’. ‘sender@hoge.com’);
```
第五引数が、スパム振り分けを喰らわないための大事なものその①。
gmailやhotmailなんかでは普通に表示されているが、昔の話を聞くと日本語が化けることがあるよう。
これを解決するには…
#マルチバイト対応のmb_send_mail関数を利用する
```
mb_language(“japanese”);
mb_internal_encoding(“UTF-8”);
mb_send_mail(‘receiver@hoge.com’, ‘タイトル’ , ‘本文’ , $headers, ‘-f’. ‘sender@hoge.com’);
```
しかし送ったメールのヘッダ見ると、JISになっているから意味ないんじゃ…謎が残る。メールは殆どJISですよ、という10年くらい前の記事がいっぱい出てくるので現状が分からん。書物してると大抵utf8だけど、メールは違うのだろうか。
```
Content-Type: text/plain; charset=ISO-2022-JP
```

#サーバー側の設定
スパム振り分けを喰らわないための大事なものその②。ip4: の後ろは設置するサーバーのip。
```TYPE: TXT
VALUE: "v=spf1 ip4:00.00.00.000 -all"```

設定がちゃんとされてるかは、```nslookup -type=TXT xxxx.com``` とコマンドを打つことでも確認できる。
```Non-authoritative answer:
xxx.com text = “v=spf1 ip4:52.68.61.205 -all”```
みたいに返ってくる。
```dig xxx.com txt``` というコマンドでも見れる。
JupyterまたはiPython Notebookでデバッグをする方法

某勉強会で少し話題になっていたので、調べてみました。

## 準備

デバッグしたい行の直前に、以下を追加します。

```python
from IPython.core.debugger import Pdb; Pdb().set_trace()
```

> `IPython.core.debugger`の`Trace`を使っても良いですが、現在ではDEPRECATED(廃止)扱いになっています。
> 参考: [IPython issue #9940](https://github.com/ipython/ipython/issues/9940)

## 実行

JupyterやiPython Notebookで普通に実行すると、前項で追加した行の直後で実行が中断されます。

![run1.png](https://qiita-image-store.s3.amazonaws.com/0/10290/3c195522-a68b-5610-c070-ca60b63afcc3.png)

`ipdb>`の後に現れるテキストフィールドに、コマンドを入力します。`h`でヘルプが表示されます。`q`で終了します。

## ipdbコマンド一覧

参考: [Python Ipdb Cheatsheet](http://frid.github.io/blog/2014/06/05/python-ipdb-cheatsheet/)

### 移動系

| コマンド | 説明 |
|:--|:--|
| n | 次の行に入るまで実行 (next) |
| c | 次のブレークポイントまで実行を継続 (continue) |
| unt 行番号 | 指定された行に到達するまで実行 (until) |
| d | ステップイン (down) |
| u | ステップアウト (up) |
| s | 次の関数呼び出しまで実行 (step) |
| r | 現在の関数が復帰するまで実行 (return) |
| q | 最後まで実行して終了 (quit) |

### 表示系

| コマンド | 説明 |
|:--|:--|
| p 変数名 | 変数の値を表示 (print) |
| a | 現在の関数の引数を表示 (args) |
| w | スタックトレースを表示 (where) |
| h | ヘルプ (help) |

### ブレークポイント設定系

| コマンド | 説明 |
|:--|:--|
| b 行番号または関数名 | ブレークポイントを設定 (break) |
| tbreak 行番号または関数名 | 一時的なブレークポイントを設定(ブレークポイントに到達したら削除される) |
| disable 番号 | ブレークポイントを無効化 |
| enable 番号 | ブレークポイントを有効化 |
| ignore 番号 回数 | 指定された回数だけブレークポイントを無視 |
| condition 番号 設定する条件 | ブレークポイントでの条件の判定値を変更 |
| cl | ブレークポイントを全て削除 (clear) |
スライサー（FDM式３Ｄプリンタ向け）の作成　考察２（外壁の厚みについて）


* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　本ソフトでは出力対象の輪郭を表す部分を外壁と称しています。
![my-tblayers2.jpg](https://qiita-image-store.s3.amazonaws.com/0/157557/27fe3f75-c67b-4793-2548-604a4b4f17c1.jpeg)
　立方体で例えると、水平な面（２面：上面／下面），垂直な面（４面：正面／背面／右側面／左側面）となります。
　これらの面の厚みについての考察です。
 
 # ２．パラメータ
　パラメータで外壁の厚みが指定されます。
　水平面については、[print-Layer-topSolidLayers]で上面の厚み，[print-Layer-bottomSolidLayers]で下面の厚みです。
　垂直面については、[print-Layer-perimeterOutlines]です。

　積層高さ=0.3[mm]／ノズル径=0.4[mm]の場合で例えると
　　topSolidLayersが 3(層)指定の場合、3×0.3=0.9[mm]となります。
　　perimeterOutlinesが3(ループ)指定の場合、3×0.4=1.2[mm]となります。

# ３．考慮点
　この指定方法は、スライサーとして利用しているSimplify3Dの指定方法なのですが、スライサー目線の指定方法だと考えます。
　ユーザ目線からの指定方法は、「一律1[mm]としたい」や「最低でも1[mm]以上欲しい」などではないでしょうか？私はそう思います。
　ノズル径の違うツールヘッドを利用したり、積層高さを変更したりすると、上記厚み部分も合わせて調整しなければいけない状況です。

　本ソフトは、上記[topSolidLayers]／[bottomSolidLayers]／[perimeterOutlines]のパラメータは元々の(層)や(ループ)指定の代わりに[mm]単位指定もできりょうにしました。
　[mm]指定の場合、その時の層高さや、ノズル径から必要な、層数やループ数を逆算させることになります。
　他のパラメータもいくつか同様の改良をしています。
　参考：[付録Ｃ　パラメータ](http://qiita.com/isTwt/items/c02d942f9568d80cf3a8)

# ４．ところで．．．
　下図のような形状の場合、外壁の厚みはどのようになるでしょうか？
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/107dcf58-495e-ee4e-d07c-6d828a0bace1.jpeg)（横からの図。三角柱を横にした形状）
　垂直，水平面(下記黄色枠)は前記直方体と同じですが、斜めの面(下記赤色枠)については別に考慮する必要があります。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/db0d89a5-5463-212d-a3a9-fde49b63ded5.jpeg)
　上図の場合、面が上方向であるめた、上面厚みと側面厚みを考慮します。
　水平方向の厚みは、パラメータ[perimeterOutlines]で必要な厚みがとれます。
　しかし上面方向の厚みについては注意が必要です。
　下図の場合、垂直方向の厚みが不足します。（水平方向３ループ）赤黄緑。垂直方向を見ると３層無く、１層や２層分となる）
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/004518cd-f4d9-d81f-de87-bb557a0de68e.jpeg)
　これを解消するため、下図のエリアを外壁として扱う必要があります。（水色塗りつぶし。斜め部分ではオレンジ囲い
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/86510fee-2da0-f02f-d907-b77919c2b4ee.jpeg)

　本スライサでは、この領域（外壁とする領域）を求めるため、以下の方法としています。
1. 出力対象の各面のうち法線が上向きの面（法線のZ＞0）を元に垂直方向の厚み（topSolidLayers相当の厚み）分下にシフトした面から構成される上面モデルを生成（下図ではオレンジ）
2. 上記同様に法線が下向きの面(法線のZ＜0)の面を元に垂直方向の厚み（bottomSolidLayers相当の厚み）分上にシフトした面から構成される下面モデルを生成（下図では水色）
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/97a4c2e5-2068-ee95-d79c-435885da60f1.jpeg)
3. 出力対象と、上面モデル，下面モデルを同一層高さでスライス
4. 求めた３つの閉領域のうち、出力対象の閉領域と、上面モデルの閉領域または、下面モデルの閉領域が重なる部分を外壁部分とする
![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/8549ad1b-ad03-9750-dcd8-10d47d9e9368.jpeg)

* 実際は、出力対象の閉領域からまず、水平方向の外壁となるループ分を求め、残るインフィル領域と上面モデルの閉領域，下面モデルの閉領域の重なる部分を求めています。重ならい部分は通常インフィルとなり、重なる部分は100%インフィルとして処理します。
DeepMind-Atari-Deep-Q-Learner を動かす

# description
- 動作させ学習する様をみる
- https://github.com/kuz/DeepMind-Atari-Deep-Q-Learner

# 環境
- debian8
- ubuntu16
- memory 8G程度必須

# install & run
```
sudo apt-get build-essential gcc g++ cmake curl libreadline-dev git git-core libjpeg-dev libpng-dev ncurses-dev imagemagick unzip
# 存在しないpackageは削除して実行

mkdir ~/source
cd ./source
git clone https://github.com/kuz/DeepMind-Atari-Deep-Q-Learner.git
cd DeepMind-Atari-Deep-Q-Learner
sudo bash ./install_dependencies.sh
./run_cpu breakout 
```



# 補足
- 学習step数は, 50M
    - 1M stepでは, よくて5ブロック消す程度

- debian8 + i7 2600k
    - 40時間で 600k step 処理
- ubuntu16(vm) on windows + i7 3930k
    - i7 2600kの1.3~1.5倍程度 (vm上だが2600kより早い)
    - core数, quad channelが効いている?
【SSL】オレオレ証明書のインストール

SSLを用いたサイトのテストをする際、証明書を使わないと
![sha1.png](https://qiita-image-store.s3.amazonaws.com/0/156988/e7db5ef6-606b-ae2c-ed97-ccc955f35b1c.png)
こんなエラーが毎回表示される。表示させる方法はあるのだけれど、毎回やるのは面倒。

少し前にはSHA-1を用いた証明書をインストールする方法も公開されていたのだけれど、2017年1月からchrome等のブラウザではSHA-1を用いた証明書は安全とみなされなくなった。

そこで、XAMPP環境でSHA-256を用いたオレオレ証明書の発行をしてみる。

#xampp環境での準備
php.iniの
`extension=php_openssl.dll`
を有効にすればxampp環境でSSLを使う準備ができる。

#localhostでの証明書の生成
##SHA-256を指定
Apacheのルートディレクトリにあるmakesert.batを修正する。
`bin\openssl req -new -out server.csr`
↓
`bin\openssl req -new -out server.csr -sha256`
*-sha256*オプションを付与することで、SHA-256を使った証明書の作成ができる。
##有効期間を10年にする
デフォルトでは有効期間が1年。毎年作るのも面倒なので10年にしておく。
`bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365`
↓
`bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650`
単純に*365*を*3650*にするだけ。

#バッチの実行
makesert.batを実行する。
Common Nameに、証明書に利用するドメイン名を指定する。
xamppの場合、localhostでOK。
パスフレーズを指定するとApacheの起動時に必要になる場合があるので無しでOK。

```
Enter PEM pass phrase: ← パスワード入力
Verifying - Enter PEM pass phrase: ← もう1度

Country Name (2 letter code) [AU]:JP ← 日本なら
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Chiyoda
Organization Name (eg, company) []:← 組織名
Organizational Unit Name (eg, section) []:← 部課
Common Name (eg, YOUR name) []:localhost ← ドメイン名
Email Address []:mail@example.jp

A challenge password []: ← 空欄でOK
An optional company name []: ← 空欄でOK
Enter pass phrase for privkey.pem: ← 最初のパスワード
```

#Apacheへの証明書の指定
apache/conf以下に

- ssl.crt/server.crt
- ssl.key/server.key

が生成されているので、httpd-ssl.confファイルにて指定する。

```
SSLCertificateFile "conf/ssl.crt/server.crt"
SSLCertificateKeyFile "conf/ssl.key/server.key"
```

#ブラウザへのインストール
server.crtファイルをダブルクリックし、「証明書のインストール」を押してウイザードを起動する。

![証明書1.png](https://qiita-image-store.s3.amazonaws.com/0/156988/255ce98a-1aa8-9985-6f0d-9e6276bb864f.png)

「証明書をすべて次のストアに配置する」の「参照」を押して「**信頼されたルート証明機関**」を選択する
![証明書2.png](https://qiita-image-store.s3.amazonaws.com/0/156988/4fdea5d4-f1fe-1dd4-c4ae-91a9a41be405.png)

#Apacheを再起動
Apacheを再起動。https://localhostにアクセスしてエラーが表示されないことを確認する。
geometry > triangle > Perpendicular BisectorからSkecthUpで入力するHexagonに対する内接円の半径計算

```txt:環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

関連 http://qiita.com/7of9/items/cfe0400c38c6b1d3d8f6

モニター台の検討。

- Depth 43mmのもの
- レイアウト変更可能にする
   - Hexagonの形状を２つに割ったもの
   - 配置によって、ラウンドテーブル、横長のテーブルに可能
   - 販売品は[こちら](http://www.tsunagu-coms.com/items/awai.php)だが、今回は制作する
- 足は取り外し可能のものとする
   - 2種類の長さがあれば、モニター台、来客時のテーブルに対応可能

Depth 43mmからSketchUpで入力する内接円の半径を計算する。

正三角形の垂直二等分線([Perpendicular Bisector](http://mathworld.wolfram.com/PerpendicularBisector.html
))の長さが43mmあればよい。

Perpendicular Bisectorの長さ(len_pb)からHexagonの半径の計算は

```math
radius = len_{pb} * 2 / \sqrt{3}
```

Depth 43mmに対して、内接円の半径は49.65mmとなる。
六角形の幅はその２倍となり、99.304mm。　
横長のテーブルに配置した場合は、49.65*3 = 148.95mm。　予定していたサイズができそうだ。

右下がラウンドテーブル形状、左上がモニター台としての使用状態。
手前の茶色のテーブルは、キーボード置き場、手計算などの作業スペース。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/559d1c42-36c4-dbad-1354-691fecda536e.png)
JavaScript 複数の文字列をAND検索で探し出したい

```javascript:search.js

/*
 *  複数の文字列をAND検索で探し出したい
 *  大文字小文字も区別しない
 */
var line  = ["1tEst","test2","3test"];
var search_string = "teSt 2";
var match_flag = isMatchMulti(line,search_string);

function isMatchMulti(line,search_string) {
  var separatorString = /\s+/;
  var arrayStrig = search_string.split(separatorString);  
  var match = new Array();
  for(var i = 0 ; i < arrayStrig.length; i++ ){
    reg = new RegExp("(?=.*" + arrayStrig[i] + ")","i");
    match[i] = false;      
    for(var j = 0 ; j < line.length; j++ ){
        if(line[j].match(reg)){
          match[i] = true;
        }
    }   
  }
  var match_flag = false;
  if(0 < match.length){
    match_flag = true;
  }else{
    match_flag = false;
  }
  for(var ii = 0 ; ii < match.length; ii++ ){
    if(match[ii] == false){
      match_flag = false;
    }
  }
  return match_flag;
}

```
うっかり消したgit stashを戻す方法

1. sha1ハッシュを探す<br>
````````````````````````````````
git fsck --unreachable | grep commit | cut -d' ' -f3| xargs git log --merges --no-walk --grep=WIP 
````````````````````````````````
2. cherry-pickで変更を持ってくる<br>
````````````````````````````````
git cherry-pick -n -m1 <sha1 hash>
````````````````````````````````
[macOS]macOS Cocoaプログラミングをはじめる

<p>macOSのCocoaプログラミング状況は近年大きく変わった。理由は、iOSのCocoa touchからのフィードバックということになるのだろう。</p>

<p>iPhone SDKが出た時は、UI関連のフレームワークは、OS XとiPhoneで大きく異なったが、最新のフレームワークでは、iOSプログラミングの要領でmacOSプログラミングができるようになっていることに驚くプログラマーも多いと思う。この進化を続けているmacOS Cocoaプログラミングを今のタイミングで入門する際に役立つ情報を集めてみた。</p>

<p>最初に読んだ方が良い、全体を俯瞰する資料といえば、以下だろう。</p>

<ul>
<li><a href="https://developer.apple.com/library/content/documentation/General/Conceptual/MOSXAppProgrammingGuide/">Mac App Programming Guide</a></li>
</ul>

<p>具体的なコードの説明が足りないため、物足りないが、ある程度の技術が身についた後でも、気づかされる情報が説明されているので、お勧めだ。</p>

<p>macOSプログラミング環境は大きく変わってきている。Swiftもそうだし、ViewControllerなども大きく変わった。市販の書籍もこの進化に追いついていない。でも、逆の見方をすれば、どの書籍も最新の環境にあっていないので、どんな古い書籍でも役立つと言えるのでは？</p>

<p>ということで、著者が選択したのは、昔から人気があったヒレガス本。それも、最初の日本語訳版を頭から最新の環境に読み替えて取り組んでいこうと、個人的に考えている。</p>

<p>この書籍を紹介しているサイトを探したが、古すぎて見つけられなかった。残念。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/RandomApp">https://github.com/murakami/workbook/tree/master/mac/RandomApp</a> - GitHub<br />

関連情報
<a href="https://developer.apple.com/library/content/documentation/General/Conceptual/MOSXAppProgrammingGuide/">Mac App Programming Guide</a><br />
<a href="https://cocoa-study.connpass.com">Cocoa Study (connpass)</a><br />
<a href="https://connpass.com/series/499/">Cocoa勉強会 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa Study (ATND)</a><br />
<a href="https://mosa.connpass.com">MOSA (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
技術英語 > Score one for Python / Count me in. / Score:20

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 749 / 12833)

> Python handles humungous integers with no problem. **<font color=red>Score one for Python</font>**.

意訳「Pythonはとてつもなく大きい整数を問題なく扱える。Pythonに一票。」

@ 放浪の天才数学者エルデシュ by ポール　ホフマン
> エルデシュはよく言っていた。
>
>「人生のゲームは、SFのスコアを低く抑える事だ。きみがもし人生で悪いことをすれば、SFが２点獲得する。きみが人生でなすべきよいことをしないでいると、SFに一点入る。きみには決して点が入らない。だからSFがかならず勝つ」

SFというのは神様のことだったかと思う（メモなし）。

なお、私のSFスコアは53万です。


<hr>
関連して思い出したのは

> Count me in.

https://www.merriam-webster.com/dictionary/count

> :  to include or exclude by or as if by counting <Count me in.>

<hr>
Scoreは20という区切りで使う場合もあったかと。

http://ejje.weblio.jp/content/score
> 古期北欧語「刻み目，20」の意; 昔，羊等を数えるのに，20 頭ごとに棒切れに刻み目を入れたことから
nvidiaのドライバをdebianに入れる方法の覚書

最初に

nvidiaのドライバを入れるときはrootでスクリプトを走らせなければならず、かつXwindowが起動していてはダメ。
なので自分はmulti-user.targetで立ち上げなおしてからrootでログイン作業した。

必要なもの

linuxカーネルのソース等が必要。下記コマンドで入れれる。

```bash
aptitude install linux-source linux-headers-`uname -r` xserver-xorg-dev
```

これが済んだらnvidiaのサイトからドライバ落としてsudo run。
nvidiaのドライバが諸々と競合してシステムが動かなくなることが稀にあるので要注意。
gitbucketのdockerコンテナ移設（引っ越し）

ホスト上にインストールされているgitbucketを、dockerコンテナ化して移設（引っ越し）した際のメモ

gitbucket： ver 3.9

## ポイント
- 基本的に、gitbucketのホームディレクトリをそのままコピペするだけで、過去のコードや設定含め全て引き継げる。
（おそらく正しいやり方は、移設前環境から任意のクライアントに全リポジトリをgit cloneして、移設後環境へ一つずつpushする方法かもしれない。ただしユーザ追加含め全設定をやり直しは煩雑なので、この方法で試した。）
- 移設先が他ホストの場合など、URL(IP)が変わる場合は、.gitbucket.confファイルのbase_urlを変更する必要あり。
※base_urlの値は、正しく指定しないとgitbucketが正常に起動してくれないので注意が必要。

## 引越手順
###⑴ dockerで新gitbucketを構築
作成方法は以下参照
http://qiita.com/suzukihi724/items/7859724c9a0e44bf1730
試したバージョンは3.9です。
この時、gitbucketのホームディレクトリのデータは、コンテナ内で持たず、ホストにマウントすること。

###(2) 移設前のgitbucketホームディレクトリ配下を、移設後のホームディレクトリへコピー
ホストインストール時のデフォルト設定では、~/.gitbucketがgitbucketのホームディレクトリに指定されている。
その配下を、docker化したgitbucketのホストマウント先のホームディレクトリにコピーする。

※参考） tar.gzに固めて移行する場合
圧縮：　`tar cfvz　[アーカイブ名].tar.gz [ディレクトリ]`
解凍：　`tar xfvz [アーカイブ名].tar.gz`

###(3) 移行先の.gitbucket.confファイルを編集
URLが変わる場合のみbase_urlの設定値を修正。

以上で移設は完了。

ただし、各クライアント側は移設先のgitbucketから、再度各リポジトリをcloneし直す必要あり。
また、ホスト自体が変わった場合は、SSHの公開鍵設定を移設先ホストに設定することも忘れずに。（gitbucket内部の設定は引き継がれる）
Caledarクラスを使わない日付取得

日付取得と検索して大抵出てくるやつ

```java
Calendar c = Calendar.getInstance();
Date date2 = c.getTime();
/*
そういえばCalendarじゃないけど以下もあるね
Date d = new Date();
*/
```

Java8で追加されたやつ

```
//Instantで現在日時を取得
Instant i = Instant.now();
//LocalDateTimeで取得
LocalDateTime l = LocalDateTime.now();
```

他にも色々あるけど割愛
そういえば、java.sql.Timestamp型からLocalDateTime型に変換できるみたいですね
Maya UIの言語を切り替える

# Maya UIの言語を切り替える

## 公式ドキュメント
https://knowledge.autodesk.com/ja/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/kA230000000u0kr.html


通常は、OSの環境が反映されますが、環境変数MAYA_UI_LANGUAGEで強制的に言語環境を設定することができます。

英語メニュー
MAYA_UI_LANGUAGE=en_US

日本語メニュー
MAYA_UI_LANGUAGE=ja_JP


## Windows 10の設定
**Windows -> 右クリック -> システム**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/88f9dc88-e240-620e-682a-9347cf5b6838.png)

**システムの環境設定**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/46834022-4069-5d91-5cb8-4d169d6bf7ed.png)

**環境変数**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/0b51fb8d-abcb-45c7-7adc-03053cfa193d.png)

システム環境変数の新規 -> 
変数名：MAYA_UI_LANGUAGE
変数値：en_US　or ja_JP
-> OK
-> OK
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/0a264387-d837-de6a-e49c-f353d1e4e97f.png)
Ruby｜クラス内でのアクセサについて

会社でアクセサをクラス内で使う？的な話になったので考えたこと書いてみました。
決して、絶対にこう！という話をするつもりではないです。

## きっかけになったソースコード

サンプルコードを載せるとしたらA案、B案のどっちがいい？というはなし

```ruby
# A案
class Bazz
  attr_accessor :bar

  def initialize(bar)
    self.bar = bar # setter
  end

  def fizz
    "#{bar}-fizz" # getter
  end
end

bazz = Bazz.new("foo")
p bazz.bar #=> "foo"
p bazz.fizz #=> "foo-fizz"
```

```ruby
# B案
class Bazz
  attr_reader :bar

  def initialize(bar)
    @bar = bar
  end

  def fizz
    "#{@bar}-fizz"
  end
end

bazz = Bazz.new("foo")
p bazz.bar #=> "foo"
p bazz.fizz #=> "foo-fizz"
```

どこが違うかというと、ゲッター／セッターを使っているかどうかという点です。
A案でもいいと思っているのですが、同僚から「なんか違和感がある」とのこと

## どこに違和感があるか

私は、A案のようにインスタンス変数は書かずにゲッター／セッターを通してアクセスするようにしています。
ゲッター／セッターにした方が影響範囲が少なくなると思っているのでそうしています。

B案を推している同僚の意見としては、
「A案の`bar=`をクラス外で一度も使っていないところに違和感がある」
ということでした。

確かに今回のサンプルだと`bar=`を使っていませんし、`initialize`で初期化した値を参照することしかしてません。

とはいえ、ゲッター／セッターを取っ払って、インスタンス変数に直接操作をすると影響範囲が大きそうでモヤモヤします。
いざとなったら`@bar`を置換すれば十分と意見もあり、それは危険じゃないかと・・・


## 何がベター？

ググってみたら、[issue](https://github.com/bbatsov/ruby-style-guide/issues/538)ありました。
:warning:英語が得意じゃないので間違った理解をしているかもしれません:warning: 

こうあるべき！といった確固たるものがあるわけではないが、何をどうしたいかが重要とのこと
リンク先ではリファクタリングしやすくなるとあるから今回のサンプルでいうと、これがベターなのか？

```ruby
class Bazz
  attr_reader :bar # セッターは公開したくない

  def initialize(bar)
    @bar = bar
  end

  def fizz
    "#{bar}-fizz" # B案と違ってゲッターを利用している
  end
end

bazz = Bazz.new("foo")
p bazz.bar #=> "foo"
p bazz.fizz #=> "foo-fizz"
```

あまりまとまりのない内容ですが、コメントいただけると幸いです。
SpyderをSparkで動かす (もちろんBigInsights)

# はじまり
IBMのHadoopソリューションのBigInsightsはSparkを含んでいるが、プログラミングの負荷を下げるための開発環境は別途用意する必要がある。
Spyderは簡単に言うと、オープンソースの統合開発環境。
詳しくは以下を参照：
https://ja.wikipedia.org/wiki/Spyder_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
今回は、Redhat7.2で構築したBigInsightsを対象に、Spyderを導入してSparkのプログラミングをする環境設定を行う。

# Spyderのインストール
Redhat7系の場合インストールは非常に簡単。
まずは安心と信頼のEPELリポジトリの導入。追加パッケージはだいたいこのリポジトリ。

`$ yum install epel-release`

spyder実行に必要となる依存ソフトウェアのインストールを実施しておく。
`$ yum install qt qt-devel qt-doc PyQt4 PyQt4-devel qtwebkit PyQt4-webkit`

pipのインストール
`$ wget https://bootstrap.pypa.io/get-pip.py`
`$ python get-pip.py`

Spyderのインストール
`$ pip install spyder`

確認
`$ spyder -help`
> Usage: spyder [options] files
  Options:
  -h, --help            show this help message and exit
  --new-instance        Run a new instance of Spyder, even if the single
                        instance mode has been turned on (default)
  --defaults            Reset configuration settings to defaults
  --reset               Remove all configuration files!
  --optimize            Optimize Spyder bytecode (this may require
                        administrative privileges)
  -w WORKING_DIRECTORY, --workdir=WORKING_DIRECTORY
                        Default working directory
  --show-console        Do not hide parent console window (Windows)
  --multithread         Internal console is executed in another thread
                        (separate from main application thread)
  --profile             Profile mode (internal test, not related with Python
                        profiling)
  --window-title=WINDOW_TITLE
                        String to show in the main window title
  -p OPEN_PROJECT, --project=OPEN_PROJECT
                        Path that contains an Spyder project
>

実際に起動する
`$ spyder`
![スクリーンショット 2017-01-27 15.49.12.png](https://qiita-image-store.s3.amazonaws.com/0/137326/69569b88-f01d-f547-3638-f23eaea1dfaf.png)

便利な世の中になったね

# Sparkプログラミングをしてみる
Sparkを動かすのも特に考える必要はない。普通にimportして使うだけ。
![image](https://qiita-image-store.s3.amazonaws.com/0/137326/5b41d306-c553-41d2-b3c9-9d691b56ffc5.png)


Spark Historyで確認
![image](https://qiita-image-store.s3.amazonaws.com/0/137326/44aa1cfd-46f0-db38-fdbf-a58786a8dc09.png)


#エラーがでたら
- import pysparkでno such module エラー

環境変数をセットする必要がある。今後のために.bashrcに追加しておく。

>
export SPARK_HOME=/usr/iop/current/spark-client
export PYTHONPATH=\$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:\$PYTHONPATH
>


- HDFSファイルパーミッションエラー

HDFSを見に行っているので/user/*username*/ ディレクトリがあるか確認。あればパーミッションが正しくセットされているかを確認。

お疲れ様でした。
Perlメモ サブルーチン(関数)のリファレンスをハッシュに格納する

jQueryでハッシュにfunction突っ込んでた癖で、文字列をキーにサブルーチンを分岐させたいと思ったら、Perlでそういう書き方をしたことがなかったことに気づいた。

Perlの場合、クラスを作るときはそういう書き方することはあるけど、べたに書くこともできるんだっけ？と思い、ぐぐってみたけど、意外とヒットしない。

試してみたら、意外と簡単にいけちゃった。

```Perl
my %aaa;
$aaa{test} = sub {
	print "あひゃ";
};
&{$aaa{test}};

#出力：あひゃ
```

とういう今更なメモでした。

<span class="label label-info">追記</span>
引数を付けるバージョン。宣言型(「print "あひゃ"」とかの括弧を使わないSQL文みたいな記述法 )の呼び方は何故かエラーになりました。

```Perl
my %aaa;
$aaa{test2} = sub {
	my ($arg1, $arg2) = @_;
	print $arg1, " + ", $arg2, " = ", $arg1 + $arg2;
};
&{$aaa{test2}}(1, 2);

#出力：1 + 2 = 3
```
vimでtogglする


## togglとは
作業時間等を計測して作業の質を高める最強のツール
https://toggl.com

## 既存プラグイン紹介
togglに対してStart, Stopできる
https://github.com/termoshtt/toggl.vim

## 拡張プラグイン紹介
フォークして拡張しました
https://github.com/zebult/toggl.vim

### 追加項目

* 選択範囲の文字列をタスクとしてStartする機能
`:TogglSelectStart`

* 既存の停止時の処理にタスク名、経過時間を表示する機能
`:TogglStop`

* 現在のタスク表示機能
	* タスク
	`:TogglTask`

 	* 時間
 	`:TogglTime`

### 設定例

```vim
let g:toggl_api_token = "xxxxxx"
nnoremap tt :TogglStop<CR>
vnoremap tt :TogglSelectStart<CR>
```

## おまけ

### lightline.vimでタスクと経過時間を常に表示する
`:TogglTask`と`:TogglTime`をlightlineの設定項目に追加します
設定方法はREADMEを参考にしてください

![toggl.gif](https://qiita-image-store.s3.amazonaws.com/0/86763/0b652622-00c0-a40d-5aaf-42c1c2214209.gif "toggl.gif")
PHPで名前付き引数の部分適用を実現する

久しぶりにPHP小ネタ。知恵袋から転載します。

- [PHPの関数の「デフォルト引数」について質問です。 - function ho... - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12169732102)

```php
<?php

/**
 * あらゆるcallableを対象にReflectionFunctionまたはReflectionMethodを生成します。
 *
 * @param callable $callable
 * @return \ReflectionFunctionAbstract
 */
function reflect_callable(callable $callable)
{
    if (is_string($callable) && strpos($callable, '::')) {
        $callable = explode('::', $callable);
    } elseif (!$callable instanceof \Closure && is_object($callable)) {
        $callable = [$callable, '__invoke'];
    }
    return $callable instanceof \Closure || is_string($callable)
        ? new \ReflectionFunction($callable)
        : new \ReflectionMethod($callable[0], $callable[1]);
}

/**
 * 名前で指定された引数を部分適用したクロージャを返します。
 * デフォルト引数でないものはすべて指定されている必要があります。
 *
 * @param callable $f 
 * @param array $named_args 名前=>値 の形で引数の配列を渡します。
 * @return \Closure
 */
function named_partial(callable $f, array $named_args)
{
    return function (...$args) use ($f, $named_args) {
        foreach (reflect_callable($f)->getParameters() as $i => $p) {
            if (array_key_exists($i, $args)) continue;
            $args[$i] = array_key_exists($p->name, $named_args)
                ? $named_args[$p->name]
                : $p->getDefaultValue();
        }
        return $f(...$args);
    };
}

function hoge($a = 1, $b = 2, $c = 3)
{
    return $a + $b + $c;
}

// $b = 10 だけ指定しておく
$f = named_partial('hoge', ['b' => 10]);

// $a = 1, $b = 10, $c = 3
var_dump($f()); // int(14)

// $a = 20, $b = 10, $c = 3
var_dump($f(20)); // int(33)
```
IDを使わず複合条件でhas_many

### やりたいこと

- Town has_many :spots
- Spot belongs_to :town
- city_nameとtown_nameの２つのカラムで接続

----
こうしたらできました↓


```rails:Town.rb
class Town < ActiveRecord::Base
	has_many :spots, -> (object) { where(city_name: object.city_name)}, primary_key: :name, foreign_key: :town_name, class_name: 'Spot'
end
```

### ポイント
1. (object)でselfを引数に
2. primary_keyとforeign_keyは条件が一つしかなくIDを使わない場合と同様に設定する

----
できてしまえば簡単ですが、ググってもやり方がすぐにわからず実験しながら解決しました。今後の参考になれば。
TensorFlowが遂にr1.0になるようです (1.0.0-rc0がリリースされました)

##主な変更点
- **XLA対応**
  まだAlpha版レベルのようですがGraph生成用コンパイラの新版投入されるとのこと。実行速度の向上とメモリ使用量の削減が期待できるようです。

- **TensorFlow Debugger追加** (詳細不明)
- **Python3対応DockerImage追加**
- **pip install tensorflowでインストールが可能に**
- **Python用APIコールがNumPyに近い実装に変更された**
- **実験的にJava APIを追加**
- **Android用のデモを2つ追加**


***
詳細はGitHubの[TensorFlow 1.0.0-rc0](https://github.com/tensorflow/tensorflow/releases/tag/v1.0.0-rc0)からどうぞ。
9.2 remember userを消し忘れてハマったお話。

Tutorialも９章の終わりまで来ました。
最後にチェックボックスを作ってログインを保持するかどうかの切り替え機能をつけるのですが、そこで凡ミスしてハマったお話です。

##概要

- チェックをつけずにブラウザを閉じてもログインが保持されている。
- チェックの有無にかかわらず、`remember_digest`が生成されている。

##原因
早い話が、`create`の中の`remember user`を消し忘れたのと、きちんとブラウザが閉じられていなかったのが原因でした。

チェックボックスをつける前の項で、ユーザーがログインしたことを記憶するために`create`の中に`remember user`(ヘルパー)を書いてあったのですが、チェックボックスを実装するために書き換えたコードでは削除されています。
当たり前ですが、これがあると問答無用で記憶されてしまいますので・・・

```ruby
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      remember user    #　 <=これ
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end
```
デバッグ情報見て問答無用でremember_digestが生成されていたので、絶対このせいだよな・・・とここで気づきました。
チュートリアルの文章中にはあえて削除するようには書かれていませんが、最終的なコードを見るとちゃんと消されてます。

で試しにコメントアウトしたところ、無事ちゃんと機能したようです。
しかしここでまたどうしようもない凡ミスが・・・

ブラウザがきちんと閉じられていなかったので何度消してもログイン状態が保たれてしまっていたのですね。
×だけでなくきちんと「終了」をしましょう。って、そんな人いないか・・・

こんな感じで、2日も無駄にしましたとさ。めでたしめでたし。
エラー発生時における公式ドキュメント(英語)の重要性について

#概要①
（非常によくあるであろう！）『libv8』絡みで四苦八苦した結果、
libv8の公式ドキュメント( https://github.com/cowboyd/libv8 )に従ったら一発で解消した経験を共有します。

「英語だからむーりー」とか言ってはいけません。

かのユリウス・カエサル・ツェペリも言っています。
「一番の近道は遠回りだった」
「遠回りこそが俺の最短の道だった」
と…

#概要②
macでlibv8でエラーが発生したら、
公式ドキュメント( https://github.com/cowboyd/libv8 )に従いましょう。

「ruby -e 'puts Gem::Platform.local'」でlibv8のバージョンを確認しましょう。

古かったらrubyのバージョンを変えるなり、再インストールしてみましょう。

#シチュエーション
react_on_railsのexampleである、
react-webpack-rails-tutorial( https://github.com/shakacode/react-webpack-rails-tutorial )
のセットアップ過程でbundle installエラーが発生。

#bundle installのエラー
```
An error occurred while installing mini_racer (0.1.7), and Bundler
cannot continue.
Make sure that `gem install mini_racer -v '0.1.7'` succeeds before bundling.
```

私「なんかよく分からんが、mini_racerってやつが原因なんだな！よしググろう！」

#「mini_rancer error」でググる => 全滅
私「なんか同じようなシチュエーションでエラーの事例無いんですが…」

#エラー文をよく読む
```
(Libv8::Location::System::NotFoundError)
of V8 found on your system and *not* the one that is bundled with
the libv8 rubygem.
```
私「あれ！よく読んだら、『libv8が見つかりません』って言ってるぞ！よしググろう！」

#「libv8 error」でググる => 全滅
私「おー！qiita(日本語)で対処がいっぱい出てくるじゃん！全部試せば何とかなるでしょ！」

⇛全滅。エラー解消せず。

#libv8の公式ドキュメントをあたる => エラー解消
```
Note on OS X macOS binaries

If you're installing libv8 on a macOS system that is present in the list above, 
and despite that, RubyGems insists on downloading a source version and compiling it, 
check the output of ruby -e 'puts Gem::Platform.local'. 
If it does not reflect the current version of your OS, recompile Ruby.

The platform gets hardcoded in Ruby during compilation and if you've updated your OS since you've compiled Ruby, 
it does not represent correctly your current platform which leads to RubyGems trying to download a platform-specific gem for the older version of your OS.
```

「よし！『ruby -e 'puts Gem::Platform.local'』を試そう！それで古いやつならrbenvよりrubyを変えれば良いんだな！」

⇛大成功。rubyのバージョンを切り替えることで、「x86_64-darwin-16」になり、エラーが解消。
　（capybara-webkitのインストールでエラーが発生したのは、また別のお話。。。）
　（まあそれも、公式ドキュメントに従って、qmakeコマンドのPATHを通したら解消したんですが。）

私「本当に…ありがとう…それしか言う言葉が見つからない…」

#結論
アンチパターン：
とにかく頭ごなしにググる⇛日本語のドキュメントの答えを試す⇛結果に一喜一憂する

ベスト・プラクティス：
エラー文をよく読む⇛エラー対象に目星をつける⇛エラー対象の公式ドキュメントでエラー対処方法を探す⇛解決

#個人的な意見
アンチパターンには２つの良くない点があると思います。
①開発者ではない人間が記述してるため、シチュエーションの違うエラー（ex.バージョンが違う）に対処できないことがある。
②エラーの対処法しか読み取れず、エラーの背景(=システムに関する知識)を学習できない。

それに対して、ベスト・プラクティスは下記の良い点があると思います。
①開発者が記述しているため、エラー内容/対処が詳細に記述している。
②エラー内容が詳細に記述されているため、エラーの背景(=システムに関する知識)が学習できる。

以上より、エラー発生時は「学習の機会だ」と捉え、公式ドキュメントに当たるべきだと考えます。

#P.S.
この記事は、ド素人のエンジニアの個人的見解であり、人によって「おかしいだろ！」と思うこともあると思います。
その時はぜひコメントより、ご意見をよろしくお願いします。

#P.S.S.
７部は最高。