OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのレンタルサーバーにSSHでログインする

#さくらレンタルサーバーでホームページを管理すること

レンタルサーバーの一つであるさくらサーバーですが、その利用方法はまちまちです。

FileZilaやWinscpなどのソフトをパソコンにインストールして、
ホームページなどをアップまたは更新することも可能ではありますが、
今回は、ソフトを使わずにSSH接続で、さくらのサーバーにログインする方法を書きます。

#前提条件

さくらレンタルサーバーに契約していて、アカウントとパスワードが発行されていることが条件です。

```契約時に届く情報
FTPサーバ名     ：   sumple.sakura.ne.jp
FTPアカウント     ：   sumple
FTP初期フォルダ  ：   www
パスワード       ：   password
```

さくらサーバーでは、一番はじめに設定する初期ドメインがFTPサーバの名前に当てられます。
パスワードは後で変更も可能です。

FTPソフトを使って、さくらのサーバーにログインして、ホームページの更新など作業を行う際も、こちらの情報を、最初にソフトに設定することになります。

#ssh接続でログインする

FTPのソフトを使わずに、ターミナル(コマンドプロンプト)からコマンドを打ってログインします。

##方法1 (パスワード認証)

```
ssh sumple@sumple.sakura.ne.jp
```
上記のコマンドを打つと、パスワードを聞かれますので、
サーバーのパスワードを打ち込みます。
するとログイン出来ます。

ベーシックなsshのログインの方法になりますが、毎回パスワードが打つのが面倒だったりします。

##方法2 (鍵認証)

###鍵を作成します。(公開鍵と秘密鍵)

```
cd
ssh-keygen
```
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
というファイルが生成されます。


###さくらサーバーに公開鍵の登録

```
scp ~/.ssh/id_rsa.pub sample@sample.sakura.ne.jp:/home/sample/.ssh/authorized_keys
```
上記のコマンドで公開鍵をサーバーに登録しています。
次からはパスワードを入力せずにログインすることができるようになります。

```
ssh sumple@sumple.sakura.ne.jp
```

###鍵の権限の変更

さくらサーバーにログインし、下記を実行

```
chmod 600 .ssh/authorized_keys
```

権限については400でも可能です。
Docker の volume でホストと共有したファイル（ディレクトリ）にコンテナからアクセスできないときは

パーミッションを変えても、オーナーやグループを変えてもどうしてもアクセスできない（Permission denied）……とお困りのあなた。

ホスト側の SELinux が原因だったりします。ここで短絡的に `setenforce 0` する前に。

ボリュームの共有オプションに `:z` を付けると幸せになれるかもしれません。

```bash
$ docker run -v /host:/container:z ...
```

```yaml:docker-compose.yml
---
version: '2'

services:
  some_data_volume_container:
    image: busybox
    volumes:
      - /host:/container:z
```

詳しくは[Docker のマニュアル](http://docs.docker.jp/engine/userguide/dockervolumes.html#id6)を読んでみてください。
Stack (Haskell): 自分で書いたmoduleをビルドしたい


この記事では、HaskellのStackを使っている人向けに、自分で書いたmoduleを`stack build`コマンドでビルドする方法を紹介します。

Stackの基本的な使い方は下記を参照してください：

- [Stackでやる最速Haskell Hello world! (GHCのインストール付き！) - Qiita](http://qiita.com/igrep/items/da1d8df6d40eb001a561)
- [Home - The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/)

## 前提

標準のテンプレートでプロジェクトを作った場合で説明します。例えば

```bash
$ stack new sample-project
```

でプロジェクトを作ったとします。

（もしsample-projectの後ろの引数に何かを指定していた場合は、それは標準でない別のテンプレートを指定したことになるので注意してください。）

## ディレクトリの構造

標準テンプレートで`stack new`すると、下記のようなディレクトリ構造になるはずです:

```bash
$ tree
.
├── LICENSE
├── Setup.hs
├── app
│   └── Main.hs  # main関数がある
├── sample-project.cabal  # あとで編集する
├── src
│   └── Lib.hs   # 標準のライブラリ用ソースファイル
├── stack.yaml
└── test
    └── Spec.hs

3 directories, 8 files
```

## やり方

### 1. moduleを含むファイルを作る

まず、何かmoduleを含んだ新しいソースファイル(.hs)を`src`ディレクトリ以下に作ります。

この際、 **module名とファイル名(.hs)は一致させる** ようにしてください。例えば`module MyModule`を定義する場合は、そのファイル名は`MyModule.hs`です。（要するに、Javaのpublicクラスに似たルールです）

```src/MyModule.hs
module MyModule where

myFunc :: String -> String
myFunc s = "これは" ++ s ++ "です。"
```

### 2. `sample-project.cabal`を編集する

次に、プロジェクト内の`sample-project.cabal`を編集します。

セクション`library`の中の`exposed-modules`に先ほど作った`module`の名前を記入します:

```sample-project.cabal
library
  hs-source-dirs:      src
  exposed-modules:     Lib, MyModule
  build-depends:       base >= 4.7 && < 5
  default-language:    Haskell2010
```

### 3. 他のソースコードに自作moduleを取り込む

おそらく自分でmoduleを作る場合は、他のソースコードにimportすることが目的のはずです。

今回は同じ`src`ディレクトリに標準で入っている`Lib.hs`に`MyModule`を取り込んでみます。

```src/Lib.hs
module Lib
    ( someFunc
    ) where

import MyModule

someFunc :: IO ()
someFunc = putStrLn $ myFunc "テスト"
```

main関数のある`app/Main.hs`はデフォルトのままです。

```app/Main.hs
module Main where

import Lib

main :: IO ()
main = someFunc
```

### 4. ビルド＆実行する

最後に、通常通りビルド＆実行を行います。

なお、`stack exec`で実行できるのは、`sample-project.cabal`の`executable`として書かれているもののみです。

```sample-project.cabal
executable sample-project-exe
  hs-source-dirs:      app
  main-is:             Main.hs
```

```bash
$ stack build
$ stack exec sample-project-exe
これはテストです。
```

以上です。
pipを用いてPythonのフレームワークdjangoをインストール

Pythonの有名なフレームワークとしてdjangoというのがあるらしいので、今回はそれをpipというPythonのパッケージを管理するツールを用いてインストールしてみようと思います。Pythonすらまともに勉強していないのでdjangoがどういうものかまったく知りませんが。
　まず、ターミナルで次の命令を実行してpipをインストールします。

```
$ easy_install pip
```
インストールしたら次の命令でpipをアップグレードしておきます。

```
$ pip install --upgrade setuptools
$ pip install --upgrade pip
```
それでは、次にpipを用いてdjangoをインストールしてみましょう。次の命令を実行してください。

```
$ pip install django
```
pipで管理しているパッケージを確認するには次の命令を実行すればいいようです。

```
$ pip freeze
```

```
Django==(バージョン)
```
と表示されればインストールされていることが確認できます。
bitcoinjs-lib v3を使ったhdwalletスニペット

# bitcoinjs-lib hdwallet

* 階層的決定性ウォレット
* この記事はbitcoinjs-lib@3系です

# install

```
npm i bip39 bitcoinjs-lib
```

# mnemonic generate

## 12 word

```
const mnemonic = bip39.generateMnemonic();
```

## 24 word

```
const mnemonic = bip39.generateMnemonic(256);
```

# mnemonic to masternode

```
const mnemonicToM = (mnemonic, password, network) => {
    const seed = bip39.mnemonicToSeed(mnemonic, password || "")
    const m = bitcoin.HDNode.fromSeedBuffer(seed, bitcoin.networks[network || "bitcoin"])
    return m
}
```

# master extended private key

```
m.toBase58()
```

# extended private key

```
m.deriveHardened(44).deriveHardened(0).deriveHardened(0).toBase58()
```

```
m.derivePath("m/44'/0'/0'").toBase58()
```

# extended public key

```
m.deriveHardened(44).deriveHardened(0).deriveHardened(0).neutered().toBase58()
```

```
m.derivePath("m/44'/0'/0'").neutered().toBase58()
```

# bitcoin address

## address

```
m.derivePath("m/44'/0'/0'/0/0").getAddress()
```

## private key

```
m.derivePath("m/44'/0'/0'/0/0").keyPair.toWIF()
```


# とりあえず実行してみる


```
const bitcoin = require("bitcoinjs-lib")
const bip39 = require("bip39")

const mnemonicToM = (mnemonic, password, network) => {
    const seed = bip39.mnemonicToSeed(mnemonic, password || "")
    const m = bitcoin.HDNode.fromSeedBuffer(seed, bitcoin.networks[network || "bitcoin"])
    return m
}

const mnemonic = bip39.generateMnemonic();
const m = mnemonicToM(mnemonic, '', 'bitcoin')
console.log(mnemonic)
console.log(m.derivePath("m/44'/0'/0'").toBase58())
console.log(m.derivePath("m/44'/0'/0'").neutered().toBase58())
console.log(m.derivePath("m/44'/0'/0'/0/0").getAddress())
```
看不見的圓滑線

不知道從什麼開始，可以感覺到這個「看不見的圓滑線」的存在。

（這篇不是專業的音樂文章，偏重心得感想 :four_leaf_clover:）

比較明顯的感受是從高中成為學生指揮的那個時候開始，
指揮需要比團員在整體音樂的流向和起伏更加敏銳和詳細的了解
除了需要注意各個聲部演奏的細節、強弱交錯之外，
更加需要注意到合奏時的聲音有沒有往他應該走的方向走動，

這應該就是所謂的「看不見的圓滑線」吧！

也可以說是一個很大的句子。

這時候我在指揮的手勢，其中一個部分輔助推動、跟這個大句子走。

除此之外，就是聲部的支撐。
當主旋律在進行的時候，底部會有不同的旋律在走自己的路，
有時候是從下面支撐著，一起把主旋律從底部往上推，
我在指揮的時候，這一類就一樣會有往上推的手勢輔助堆疊。

## 小時候的鋼琴譜

最近開始看小時候的鋼琴譜，
看到很多東西

> 老師會多畫上很長很長的圓滑線

通常是很大的句子，就是我上面說的「看不見的圓滑線」
老師也會用「用身體帶」、「不要斷開」、「要唱」之類的提示寫在譜上面

不知道這以小朋友的理解力來說，容不容易理解？
總之我忘記我是不是比較晚才習慣、開竅 :confused: 

假如有從心底理解這種感覺的話，演奏出來的曲子，
也可能會更加「感情流露」，
畢竟當理解這種感覺後，應該也比較能夠以真實的情感去詮釋。

## 不要亂搖

所以當一些小朋友（或是成人）以為

> 有搖身體就是有感情

就會邊演奏樂器、邊搖動身體。
這時候看起來就會有點詭異，因為身體並不是跟著曲子的起伏來韻律擺動，
同時也看起來很生硬。

之前還有在教琴的時候，
就會跟學生快忘記以前老師叫你們搖身體的事情，
要去理解曲子，跟著演奏、身體自然就會有相對應的動作了。

我是這麼覺得：

> 應該是要從演奏的情感去帶動身體

## 回到「看不到的圓滑線」

應該可以算是曲子的律動、呼吸、脈搏吧！
即使他沒有被用演奏符號標記出來，

他還是存在的。

就像我們人自然就會有的律動、呼吸、脈搏吧？
我們平常也不會強調這些動作、把這些動作特別講出來。

以上，
最近沒事想想音樂的事情有些感想就寫了這麼一篇。
ngrokを使ったLINE BOT開発環境

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です👍 (2016.11.12現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

# ngrokとは

[ngrok - secure introspectable tunnels to localhost](https://ngrok.com/)

> ngrok secure introspectable tunnels to localhost webhook development tool and debugging tool

開発者なら知ってる人も多いのではないでしょうか。localhostのポートを`ngrok.com`とトンネリングして外部へ公開してくれるサービスです。

割とマジで神。

# LINEとは

[コミュニケーションアプリ LINE](https://line.me/ja/)

> LINE(ライン)は、24時間、いつでも、どこでも、無料で好きなだけ通話やメールが楽しめる新しいコミュニケーションアプリです。

おなじみのLINEです。僕も愛用しています。


# LINE Messaging API

[Messaging APIのご紹介](https://business.line.me/ja/services/bot)

> Messaging APIを利用することで、あなたのサービスをLINEのトークルーム上で提供することができます。
LINEユーザー一人一人に合わせたユーザー体験を提供できます。

少し前にBOT trialという形でLINEのBot開発をしていたひともいるのではないでしょうか。

今回のMessaging APIはその時よりバージョンアップされたものになっていて、メッセージタイプも新しく3つ追加されていたりします。

今回このLINE Messaging APIを使ったBotの開発をしたいんですが、厄介なことに`https`でないとダメ〜〜！という規定があります。

以前は[Let's Encrypt](https://letsencrypt.org/)が非対応みたいな話があり、無料でするにはHerokuなどにデプロイして〜みたいなことをしていました。

しかし、デプロイしないといけないのもダルい....ですよね。

そこで出てくるのが**ngrok**

ここではサンプルとしておうむ返ししてくれるLINE BOTを作ってみたいと思います。

言語はJavaScript(Node.js)で、ライブラリとして[3846masa/node-linebot](https://github.com/3846masa/node-linebot)を使わせていただきます。

```js:app.js
const LineBot = require('@3846masa/linebot/lib/LineBot').LineBot;

const bot = new LineBot({
  channelSecret: '<channel secret>',
  channelToken: '<channel access token>',
});

bot.on('webhook:*', (ev) => { // 全てのイベントのフック
  console.log('You got a event!', ev);
});

bot.on('webhook:message', (ev) => { // メッセージOnly
  const message = ev.message;
  ev.reply(message);
});

bot.listen(process.env.PORT || 3000);
```

とても簡単におうむ返しのBOTを作ることができました。

では、動作確認をしてみましょう。

まずngrokをインストールしてこないといけません。[公式サイト](https://ngrok.com/download)から落としてきてください。

ダウンロードできたら先ほどの`app.js`を起動します。

現在、環境変数で設定されているポートか3000でアプリケーションが立ち上がっているので

```bash
$ ./ngrok http <port番号>
```

としてngrokを起動します。

これだけで、ランダムなサブドメインのついたURLが表示されたと思います。

![スクリーンショット 2016-11-12 1.00.30（2）.png](https://qiita-image-store.s3.amazonaws.com/0/90347/1ad87a3f-5755-d265-a52c-0e73981f0cb6.png)

あとは、LINE BOTの管理画面でこのhttpsのアドレスを追加すると、このままどこにデプロイすることもなくLINE BOTの開発ができます！

# あとがき

Twitter [@konojunya](https://twitter.com/konojunya)
DNは右から左か左から右か？

例えばこれは、[RFC4514](https://tools.ietf.org/html/rfc4514) ([Google翻訳](https://rfcs.web.fc2.com/rfc4514.html)) に出てくるLDAPのDN (Distinguished Name) の例です。

```
UID=jsmith,DC=example,DC=net
```

カンマ区切りで、順序は右から左（右が大まかな単位で、左へ行くほど細かい単位）ですよね！DNとはそういうものだとLDAPでは習うのです。Active Directoryなんかもこれです。

ところで、DNといえばX.509証明書のSubject欄やIssuer欄もDNです。例えばこれは、日本政府GPKI ApplicationCA2証明書のSubject欄です。

```
C=JP, O=Japanese Government, OU=GPKI, CN=ApplicationCA2 Root
```

。。。あれ？

左から右の順になっています。さっきのLDAPと逆ですよね。どうなっているんでしょうか。

LDAPもX.509も、DNの源流はITU-Tの[X.501](https://www.itu.int/rec/T-REC-X.501/en)にあります。ITUは規格書の古いバージョンを無償公開しており（最新版は金を取ります）、今なら[2012年版](https://www.itu.int/rec/T-REC-X.501-201210-S/en)をダウンロードできます。そしてこれが、同書9.5節「Distinguished names」からの抜粋！

```
{C = GB, O = Telecom,
(OU = Sales, L = Ipswich),
CN = Smith}
```

__まさかの上から下。__

#考察

なぜこうなったのかという経緯をきちんと調べてはいないのですが、X.501で定義するのは抽象的なデータ構造のみで、実際にコンピューターで扱えるUTF-8なりの文字列に変換するのはRFCという棲み分けになっているらしいのです。そこで[RFC4514](https://tools.ietf.org/html/rfc4514) (LDAP) と[RFC5280](https://tools.ietf.org/html/rfc5280) （X.509証明書）が個別に策定されたため、順序に関して足並みが揃わなくなったのであろうと、とりあえず推測するところです。

ほかにもDNSのホスト名をDNで表記する場合にLDAPはDCを使う（例：``DC=example,DC=com``）のに対してTLSサーバ証明書 (X.509) はCNを使う（例：``CN=*.example.com``）とか、ああまったくこんなことなら90年代にTCP/IPなんか蹴っ飛ばしてOSIがインターネットになっちゃえばよかったのにとは思いませんが、なんだか納まりの悪いことになっています。

#参考文献

K. Zeilenga, Ed. (2006)
Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names
https://tools.ietf.org/html/rfc4514 ([Google翻訳](https://rfcs.web.fc2.com/rfc4514.html))

D. Cooper, et al. (2008)
Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
https://tools.ietf.org/html/rfc5280 ([Google翻訳](https://rfcs.web.fc2.com/rfc5280.html))
【Unity】 ネットワークを利用し別のデバイスでMapを表示する

[マイネット Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mynet)二日目の記事です。

プレイしているデバイスとは別の端末で、マップなんか表示できたら面白そうだと思い、
Unityのネットワーク機能を利用して実装してみました。
#発端 
######(読み飛ばして結構です)
メタルギアソリッド5にiDROIDという仮想の端末が登場します。
ゲーム内で主人公はこの端末を操作し、マップをみたり、物資や砲撃の支援を要請できます。
このiDROIDですが、なんと[専用アプリをインストールすることで、AndroidやiOSを搭載した実世界のデバイスをiDROIDとして使用できる](http://www.konami.jp/mgs5/tpp/jp/idroid/index.php5)のです!!!


とてもおもしろそうです。
しかし、ページには無情な一文が
>※Xbox 360® および PC（Steam®）は、サポートしていません。

OMG!! [神](https://ja.wikipedia.org/wiki/%E5%B0%8F%E5%B3%B6%E7%A7%80%E5%A4%AB_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC))よ、Steamerが何をしたというのですか!!

少し話がそれました。
時代を少し遡り ゼルダの伝説 風のタクトでも[チンクルシーバー](https://www.nintendo.co.jp/ngc/gzlj/kyoryoku/index.html)というものがありました。
こちらはゲームキューブにゲームボーイアドバンスを接続することによって、アドバンス側でマップの表示やリンクのサポートが行えるというものでした。

これらのような機能をUnityで実装してみたいとおもいました。
#実装
今回はキャラクターが自由に歩き回ることができるシーンに、別の端末でアクセスした際、マップ(というかかなり引き気味の俯瞰カメラ)として機能するようにします。
メインとなる端末と、Mapを表示する端末はUnityのネットワーク機能を用いて通信させます。
Unityのネットワーク機能に関する知識が皆無だったので、[テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2015/06/13/233000)や[Unityの公式マニュアル](https://docs.unity3d.com/jp/current/Manual/UNetReference.html)を参考にしました。
Unityのシーンの組み方や、Unityのネットワーク機能等の基本の説明は省きますので上記のサイトを参照してください。
とても参考になります。

メインのキャラクターを操作する側をホストとする前提で組んでいきます。
まずはUnityのネットワーク機能を利用するために、[Network Manager](https://docs.unity3d.com/jp/current/Manual/class-NetworkManagerUNet.html)と[NetworkManagerHUD](https://docs.unity3d.com/jp/current/Manual/class-NetworkManagerHUD.html)をシーンに追加します。

次に別端末用のカメラをシーンに追加します。マップっぽくするためにこのカメラはシーンを高い位置から見下ろします。
![ac00.png](https://qiita-image-store.s3.amazonaws.com/0/150589/19619916-9333-1e97-db0f-682e8dd6a075.png)

次に、二つの端末で位地を同期すべきオブジェクトにNetworkIdentityとNetworkTransformを追加します。
今回はメインのキャラクターと、マップとなるカメラにも一応追加します。

このままでは両方の端末でプレイヤーが操作を受け付けてしまいます、テラシュールブログさんの記事のコードを参考に、メインのキャラクター用のカメラと、操作を処理するスクリプトをホスト側でのみ有効になるようにします。

```
using UnityEngine;
using UnityEngine.Networking;

public class DisableNetworkUnlocalplayerBehaviour: NetworkBehaviour {

    [SerializeField]
    Behaviour[] behaviours;

    void Start() {
        if(!isServer) {
            foreach(var behaviour in behaviours) {
                behaviour.enabled = false;
            }
        }
    }
}
```

上記のスクリプトに、インスペクターからキャラクターを操作するスクリプトと、カメラを追加します。

Mapとなる端末側には、Map用カメラとその操作がクライアント側でのみ有効になるように、先ほどと逆の動作をするスクリプトを追加します。

```
using UnityEngine;
using UnityEngine.Networking;

public class DisableOnServer : NetworkBehaviour {

    [SerializeField]
    Behaviour[] behaviours;

    void Start() {
        if(isServer) {
            foreach(var behaviour in behaviours) {
                behaviour.enabled = false;
            }
        }
    }


}
```
こちらも、操作するスクリプトとMap用のカメラをアタッチします。


あとはプロジェクトをビルドし、メインとなる側はホストとして起動し、Map側はクライアントとして接続してます。

以下の画像がメインとなるプレイヤーの画面です。
![ac01.png](https://qiita-image-store.s3.amazonaws.com/0/150589/9ddbbd22-e05a-1a3d-81f5-aed2ae02b023.png)

こちらがMap
![ac02.png](https://qiita-image-store.s3.amazonaws.com/0/150589/51f5c395-8044-4917-8675-6b432e2cefde.png)

動きを見せられないのがアレですが、ネットワークを利用し別の端末でMap(というか引いた俯瞰カメラ)を表示することができました。


これでもう一つの端末をマップとして使用したり、キャラクターを操作するプレイヤーをもう一つの端末を利用するプレイヤーがナビゲーターとしてサポートしたり等の遊び方を実現できそうです。
TATEditorとは

# TATEditorとは
皆さんも一度はテキストを表示するプログラムを作ったことがあると思います。
私も初めて自分の意思で作ったプログラムはFreeTypeでラスタライズしたグリフをコンソール上になんとなく表示するというものでした。
TATEditorはそれに少しだけ機能を追加したクロスプラットフォームな縦書きアウトラインエディタです。
※[TATEditor Advent Calendar 2016](http://qiita.com/advent-calendar/2016/tateditor) 1日目の記事です。
※本ページの内容はTATEditor 3.3.10[^1]に基づいた情報です。

## 1. 何ができるのか
### テキストデータを表示する
ただのバイナリデータが人間の認識できる文字としてディスプレイに表示されます。便利ですね。

| 行配置＼書字方向 | 縦書き | 横書き |
|:-:|:-:|:-:|
| 通常 |![縦書き×macOS](https://qiita-image-store.s3.amazonaws.com/0/150995/586ed0bc-e24a-0b03-0ba7-a39b83f08b0e.png "縦書き×macOS")| ![右横書き×macOS](https://qiita-image-store.s3.amazonaws.com/0/150995/a5f50f97-0e32-d2dd-2cf4-070bc827e328.png "右横書き×macOS")|
| 傘連判 | ![傘連判×縦書き×Windows](https://qiita-image-store.s3.amazonaws.com/0/150995/2795c045-954b-2270-73a3-a8a7fdf2eb72.gif "傘連判×縦書き×Windows") | ![傘連判×横書き×Windows×ページ表示](https://qiita-image-store.s3.amazonaws.com/0/150995/cbc4d55c-ec6e-deca-e3bd-5004f47e9f8e.png "傘連判×横書き×Windows×ページ表示") |

### テキストデータを編集する
上のような表示でも自由に新しい文字列を追加したり、不要な文字列を削除したり、文字列を移動したりできます。
### テキストファイルを開く
アクセス可能なファイルをテキストファイルとして読み込んで扱うことができます。
### テキストファイルを保存する
アプリケーション上で取り扱っているUnicode列を指定した文字コードでストレージに書き込むことができます。

## 2. 主な機能
- クロスプラットフォーム
    - Windows, macOS, Ubuntuに対応
    - テキスト描画はOSに非依存
- 文字レイアウトへの対応
    - ルビ
    - 傍点
    - 割注
    - 縦中横
    - 上付き文字
    - 下付き文字
    - 牛耕式
    - 書字方向の選択
    - 行方向の選択
    - 傘連判
- ページ表示
    - 文字レイアウトとは直交
    - 段組
    - 折り本
    - N-up機能
- 出力機能
    - PDF出力
        - WYSIWYG
        - フォント埋め込み
        - タグ付きPDFに対応
            - 文書構造を保存される
        - 独自実装
    - EPUB出力
        - 非常に簡易なもの
- クロスプラットフォームなカラー絵文字環境
    - すべての環境で一部のカラー絵文字の表示に対応
    - DirectWriteには負けます。
- 編集・検索
    - 複数選択
    - 矩形選択
    - 木構造の編集履歴
    - 行単位に独立した編集履歴
    - 正規表現検索・置換・ハイライト
    - シンタックスハイライト（正規表現）
- その他
    - アウトライン機能
    - 文字数カウンタ
    - 大雑把な原稿用紙枚数カウンタ
        - 厳密性は定義による
    - ウィンドウ透過表示機能
        - Windows, macOS, Ubuntu全てで文字以外を透過させた表示が可能
    - 指定間隔での自動バックアップ
    - Unicodeやフォントへの低レイヤでの対応
    - JavaScriptベースのマクロ機能

## 3. TATEditorの動作環境
いずれの環境でも、同じフォント・同じ表示設定ならばピクセルレベルで同じ描画結果が得られます。
Mac・WindowsのHigh DPI環境でもピクセル単位で動きます。
### Windows XP SP3以降で動く……？
上の表参照
### macOS 10.7以降で動く……？
上の表参照
### Ubuntuで動く（詳細な動作環境わからず）
下記参照（Ubuntu 14.04で文字以外を投下した状態でのスクショ）
![Ubuntu×文字以外透過](https://qiita-image-store.s3.amazonaws.com/0/150995/a79a11dc-8112-6637-2d98-c88580115da5.png "Ubuntu×文字以外透過")

## 4. TATEditorの開発環境
- C++11
    - 最近ようやくC++11を使えるようになりました。
        - Mac OS X 10.6以下のサポートを切り捨てたおかげ（C++0xのライブラリしか提供されない）
    - Windows
        - Visual Studio Community 2015
        - 最高です
    - macOS
        - Xcode 8
        - だいぶ慣れてきた
    - Ubuntu
        - Eclipse 3.8.1
        - ビルドと動作チェックだけ
- 使用ライブラリ
   - AGG 2.4 （アウトラインのラスタライズ）
   - FreeType 2.7.0 （フォントのヒンティングなど）
   - ICU 56.1 （Unicodeや文字コード周りの処理）
   - wxWidgets 3.1.0 （クロスプラットフォームなGUIライブラリ）
   - v8 （マクロ用のJavaScriptエンジン）

## 5. 明日以降のアドベントカレンダー
縦書きや斜め書きや牛耕式に対応したエディタTATEditorを作る過程で得た、それなりに有用そうな部分を紹介していきたいと思っています。
おそらく以下のような内容です。
- テキストを取り扱う上で注意すること
- フォントの仕組み
- カラー絵文字の仕組み
- 文字列描画について
- 各OSでのIMEの仕組み
- 使用しているライブラリについて
- TATEditorの編集履歴の仕組み

何かTATEditorでこういう使い方もあるよ、などの記事を書いてくださる方がいればどんどん書いてください。
[^1]: http://www.cc4966.net
(個人的に) ここが好きだよ！Swift (愛好会)

これは**[Swift愛好会 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/love_swift)** 1日目の投稿です。

---

# みなさん、飲み物は持ちましたか？

---

# 乾杯🍻

---

## (これがやりたかったので、スライドモード)

---

# 本題

---

* 何気にSwiftを始めた最初の勉強会はSwift愛好会だった
* Swiftを始めて1年経った
* 他言語界隈にいる時に、「なぜSwiftが好きなのか」をよく聞かれるので言語化しようと思った

以上3点から、個人的にSwiftの好きなところを書こうと思います。

---

# 好きなところ
* 言語自体
    * 型が厳格
    * Switchが強力
    * 関数型が使える
    * 言語自体のアップデートが早い
* 環境要因
    * コミュニティが活発
    * 質問に答えてくれる土壌がある

---

## 言語自体

---

## 型が厳格
* 兎にも角にもこれが1番
    * 厳格と言っても、Objetive-Cの`NSString`と`NSMutableString`のような分離はしていないこともよい
* [少し前に賑わっていたnull安全](http://qiita.com/koher/items/e4835bd429b88809ab33)も、型がしっかりとしていることがベースになっている気がする
    * 必ずしもnull安全がすべてを解決してくれる訳ではないが、Objective-Cを使っていた頃より明らかに楽できるようになった

Swiftは`型に始まり、型に終わる`と言ってもいいと思う

---

## Switchがかなり強力
* `break` 書かなくていいのはかなり好き
* Castもできる書き方も好き

```
let any = 1 as Any

let int: Int = {
    switch any {
    case let intValue as Int: return intValue
    case let stringValue as String: return Int(stringValue) ?? 0
    default: return 0
    }
}()
```

Enumとの組み合わせやPatternMatchと用途が広いので、用法用量を守ることが大切だとは思う

---

## 関数型が使える
* 一時変数を置いたりすることなく、簡潔に処理することが可能になり、気持ちいい
* 慣れるまでは違和感があったが、一旦覚えるとを組み合わせて解決できないか考えるようになった

個人的には `reduce` が使えるとﾖｯｼｬ•̀.̫•́✧

---

## 言語自体のアップデートが早い
(これは賛否両論あるとは思うが)

* 開発が早いだけでなく、負債や変更の影響度を考慮しつつ、よくしていこうという意図が感じられる
* [swift-evolution](http://apple.github.io/swift-evolution/) のProposalを追っていくだけでも楽しめる
* 毎日知らないことを知れてとてもいい

---

## 環境要因

---

## コミュニティが活発
* **各所で勉強会が活発！！！！！**
    * 勉強会後の繋がりもあることが多い
* try!Swiftのような世界規模のカンファレンスがある
    * (後発言語の中では珍しいのでは)

---

## 質問に答えてくれる土壌がある
(コミュニティにも付随しますが)

* 答えてくれる方々が多い
    * Twitter
    * Slack
    * etc...
* アーキテクチャ等を議論、相談したもできる
* (社内にiOSアプリエンジニアがほぼ自分1人なので、社外に聞ける人たちがいるのは、個人的に非常にありがたい)

---

## まとめ
1年やってみて、今まで触れてきた言語の中で1番好きだと断言できます。(もちろん不満点もありますが...)
とは言っても毎日書くようになったのは9ヶ月弱で、まだまだ日々発見という感じなので、1年後はさらに好きなところが増えているといいですね！
### ここに挙げた以外にもSwiftのいいところはあると思うので、ぜひ「私はここが好き！」というものをコメントしてください！

---

ということで、[Swift愛好会 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/love_swift) 1日目でした。
1年間ありがとうございました！
来年もよろしくお願いします！

    この記事とは関係ないですが、最近Genericsの使い方で悩むことが多いので、いいお手本があれば紹介ください
Rubyでランダム文字列メーカ

#これはなにか
単純にランダムなひらがなを数個出すだけです
ユーザネームとかで適当な名前が欲しかったので作りました

#プログラム1
```randomname1.rb
hiragana=[]
for c in 'あ'..'ん'
  hiragana << c
end

print "number of name :"
n = gets.to_i

while gets.chomp != 'q'
  name=""
  n.times do
   name += hiragana.sample
  end
  puts name
end 
```
"number of name : "と聞かれるので数字を入れれば
その文字数の文字列を「q」の文字を入力するまで出し続けます

プログラム自体は
`hiragana`に「あ」～「ん」を詰めて
適当にとっているだけです

ただしこのプログラムは欠点がいくつかあります

- 「ん」から始まるワードができる
- 「ゐ」「を」~~「ぁ」~~「ぃ」などの不要な文字が入る
- 「あゅ」などの読めない文字列を含む

 ・・・
(「ぁ,あ,ぃ,い,・・・」なので「ぁ」は含みません。ご指摘ありがとうございました)

ということでこの欠点を補うためにプログラム2を作りました

#プログラム2
```randomname2.rb
# all hiragana
hiragana = []

# hiragana before small ya, small yu, small yo
hiragana_bef_sy = ['き','ぎ','し','じ','ち','ひ','び','ぴ']

# exception word in hiragana
hiragana_except = ['ぁ','ぃ','ぅ','ぇ','ぉ','ゎ','ゐ','ゑ','を']

for c in 'あ'..'ん'
  hiragana << c
end

for c in ['ゃ','ゅ','ょ']
  hiragana_bef_sy.each do |c2|
    hiragana << c2 + c
    hiragana.delete(c)
  end
end

hiragana_except.each do |c|
  hiragana.delete(c)
end


print "number of name :"
n = gets.to_i

buf=""
while buf != 'q'
  name=""
  n.times do
   name += hiragana.sample
  end
  puts name
  buf = gets.chomp
end 
```
先ほどとの違いは
'hiragana_bef_sy'に「ゃ」のような文字につながる文字を入れて置き
「ゃ」「ゅ」「ょ」と結合して`hiragana`に格納します
(拗音を適切に使わせるついでに「きゃ」「しょ」など一音として扱います)
要らない文字は`hiragana_except`にメモして消します

#実際に使った感想はどうだったか
本来はハンドルネームを作るつもりだったのですか
いい感じの文字列は何回やっても取れませんでした
マルコフ連鎖とか機械学習させたデータを使う方式のほうがいいかもしれません
彼女に褒められること間違いなし！次世代のマイコン！その名はUDOO

プログラマの皆ならRaspberry Pi　arduinoなどマイコンを使ったことがあるだろう。

主な使い方として

raspberry piはサーバー関連やpcの勉強として
arduinoはラジコン、ロボットなど作って遊ぼわくわくみたいな使い方に違いない！

だがこう思ったことはないだろうか？
arduinoを制御するマイコンがもう一つほしいな…とか
arduinoとRaspberry Pi合体させればもっといいの作れるんじゃね？…とか！

そこで登場udooだ！

udooはRaspberry Piとarduinoを合体させたものだ。
しかもubuntuベースの独自osがありAndroidにすることも可能だ。

IDEはarduinoと同じのを使えarduinoより手間がかからず高性能マシンを作ることができる。

まぁ別にraspberry piだけしか使わない……からいらないとか思ってるそこのあなた！
悪いがudooはRaspberry Piの10倍の速度だ。

最新のx86でAndroidとして使うとおそらく世界最強のスペックだろう

断言しよう
時代はudooだ！！！！！！

彼女と一緒にudooを使いきゃあ！！○○くん素敵！とかクリスマスプレゼントにするのもありだ！世界最強のAndroidを作って彼女にドヤ顔間違いなし君の人生はバラ色ﾀﾞｧｱｱｱｲｱ!!!!!!
テストにおけるスクリーンショットについての私なりのポリシー

アドベントカレンダー ソフトウェアテスト1日目の @kimpaku です。
テストエンジニアとしてエンプラ系Webシステムの開発に携わっています。

今日は、ソフトウェアのテストでは欠かせない「スクリーンショット」のあれこれを書こうと思います。以下は、私個人の意見ですので、ご指摘、アドバイス等あればぜひお待ちしています＾＾

# １．スクリーンショットとは何か？
別名「画面キャプチャ」とも。本記事においては、Web画面、スマホ、その他デバイスの画面の画像を取得したものを指す。
　一般的には、エビデンスというとシステムのログであったり、DBのダンプ、出力ファイルも含まれると思いますが、画面があるシステムでは、エビデンス＝スクリーンショットという場合もあるように思います。
　スクリーンショット＋エビデンスと言ったときによくあるのが、「Excelに画像をペタペタと貼り付けるのが辛かった」話かと思います。一部の開発ではまだまだ現役なのかもしれないのですが、個人的には、特に指定がない場合、リリースなどから3カ月、半年など一定期間経つまではZipなどにして残しておいて、あとは削除してしまえばよいのかなと思っています。

# ２．なぜスクリーンショットを取るのか
## ①正しく試験をしたという証拠
実装においてはソースコードそのものが成果物になるが、テストを実施したという証拠です。
##②実施した操作を記録
どのような操作をしたかという記録が残り見直すことが出来る。テストあるあるとして、開発者から「そういえば、先月の時点でｘX画面のYYボタン押したときって、エラー出たっけ？」などという問い合わせを受けることがあります。1日に数百画面を見続けるテスターにとっては、いちいち覚えてられないので、エビデンスをまとめて置いたディレクトリを参照することが多いです。
##③納品物
業界によっては、お客さまから納品する物件の1つとして求められたりする。

# ３．いつスクリーンショットを取るのか
　例えば、機能的な動作を確認するテストにおいては、を実施する３つのタイミングだと思っています
　①確認したい機能を操作する直前
　②機能が結果を出すまで
　③機能が結果を出した直後
　
　おそらく、典型的なエビデンスと呼ばれるものは③なのかなと思います。
　あえて、①、②も取るのは、自分自身が試験通り操作したことを残すという意味で取っています。というのは、
　テストをしたことがある方なら経験があると思うのですが、バグがあったときに開発者に報告すると「再現しないよ(´･ω･｀)」って言われることってあると思うんですね。
そういう時に、まとめてスクリーンショットを渡して、漫画のように見てもらって再現手順を見てわかってもらえるようにしています。
**①操作直前**
![WS000287.PNG](https://qiita-image-store.s3.amazonaws.com/0/89320/062fded9-5ef7-0eef-6d2e-85468c47047d.png)

**②操作直後**
　![WS000288.PNG](https://qiita-image-store.s3.amazonaws.com/0/89320/e6695429-68e2-97ca-78f9-b23c86ffea41.png)

**③結果表示後**
![WS000289.PNG](https://qiita-image-store.s3.amazonaws.com/0/89320/794a6c27-db94-16d5-661c-dea3ec26c95e.png)

# ４．どうやってスクリーンショットを取るのか？
　Windowsの標準機能の「Prtsc」で取得して、ペイントに貼り付けるという古典的な方法もあるかとは思いますが、私が使うのは主に2つ(+1)です。
　①[Snipping Tool]( https://support.microsoft.com/ja-jp/help/13776/windows-use-snipping-tool-to-capture-screenshots ) ... Windows標準のツール。画面を簡単操作で切り取ることが可能。標準搭載なのでソフトウェアインストールの制限のある環境などでも使える。
![WS000278.png](https://qiita-image-store.s3.amazonaws.com/0/89320/b58e4dd3-e342-2e52-b3e7-6dfbe7c9934d.png)
　②[SnapCrab](http://www.fenrir-inc.com/jp/snapcrab/), [Winshot](http://forest.watch.impress.co.jp/library/software/winshot/)といったフリーソフトウェア ... インストールが必要であるものの、ファイル形式、連続撮影、ディレクトリ指定、ショートカットなど細かい指定ができるのが特徴。個人的には、いちいち記録用ディレクトリを決めたり、名前を付けたりしなくて良いため愛用している。
　(番外)　[AGDRec](http://t-ishii.la.coocan.jp/download/AmuseGraphics.html) ... 画面の動画を作成するツール(シェアウェア)。個人的には、取り忘れることも少なく好き。

# 5.その他、気を付けていることなど
##①不必要なものが映り込んでいないか
気づかないうちにメールのポップアップなどデスクトップ通知であったり、他のウィンドウ、はたまたデスクトップが映り込んでいて余計な情報が入っていることで、セキュリティ的なリスクになったりします。なので、特に納品を求められるものなどは事前にパラパラと眺めて、不要な映り込みがないかチェックしましょう。
![WS000291.PNG](https://qiita-image-store.s3.amazonaws.com/0/89320/5f2d6ad9-68d3-fbaf-4564-994b5b379551.png)

##②必要なものが映っているか
これもまた、気づかないうちに対象物以外がアクティブになっていたり、画面が切れていて必要な部分が映っていなかったりします。ツールによっては複数ディスプレイに対応しておらず、あとから見てみたら、「何も映っていない画像ファイルばかりが・・・」となることがあるので、スクリーンショットを取り始めるタイミング、２，３枚取ったところで実際に取得できているか確認することをお勧めします。

##③マウスは入れる
個人的な好みだと思うのですが、マウスのアイコンを入れたほうが後からどう操作したのかが分かるので、入れるようにしています。

#最後に
ここまでつらつらとスクリーンショットについて書いてきましたが、企業や業界によって求められるものは違うように思います。筆者自身も面倒だなと思ってやってきたこともありますが、一番思うのは良いプロダクト／サービスを生み出すためにツールを使って、効率的に作業をして品質を高めたい。そのためには、問題があったこと、問題がなかったことをスクリーンショットで見せるのが手っとり早いなという経験と実感です。一参考になればと思います。

明日は、 @mhlyc さんですね。よろしくお願いします。
条件分岐のためにstep関数を使う時の考え方をまとめてみた

GLSLでは**条件分岐をする際にif/else構文を使うと処理負荷が高い**と言われています。
（その分だけ暖を取りやすくなるかもしれませんが・・・？）

そこで、最初に考えつく代替案は三項演算子ではないでしょうか？

```glsl
vec3 BLACK = vec3(0.0);
vec3 WHITE = vec3(1.0);

vec3 color;

// こんなif文は、
if (x < 0.5) {
  color = WHITE;
} else {
  color = BLACK;
}

// こんな三項演算子に置き換える
color = (x < 0.5) ? WHITE : BLACK;
```

こんな感じでif/else構文を避けていくわけですが、この方法の欠点は**ベクトルを一度に条件分岐することができない**事です。

ですが、step関数とmix関数を使うと**ベクトルの要素ごとに条件分岐をしてその結果をベクトルに直接反映させる**事ができます。


# とりあえずstepの用法
とりあえずstep関数の用法ですが、困った時の「[WebGL 1.0 API Quick Reference Card](https://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf)」にはこんな説明が書いています。

```glsl
// 0.0 if x < edge, else 1.0
T step(T edge, T x)
T step(float edge, T x)
```

**要は引数の内容に応じて0.0か1.0を返してくれる関数**ですね。

例えばこんな感じです。

```glsl
vec2 x = vec2(0.25, 0.75);
vec2 edge = vec2(0.5);

// .xは 0.25 < 0.5 なので、0.0
// .yは 0.75 >= 0.5 なので、1.0
vec2 y = step(edge, x) // vec2(0.0, 1.0) 
```

vec2を使っていますが条件分岐の結果が.xと.yで異なっているのが分かるかと思います。


で、**これとmix関数を組み合わせる事でベクトルでもif/else構文や三項演算子の代わり**を果たす事ができます。

```glsl
vec3 BLACK = vec3(0.0);
vec3 WHITE = vec3(1.0);

vec3 color;

vec3 x = vec3(0.4, 0.5, 0.6);
vec3 edge = vec3(0.5)

// .xは 0.4 < 0.5 なので、0.0
// .yは 0.5 >= 0.5 なので、1.0
// .zは 0.6 >= 0.5 なので、1.0
// 結果、vec3(1.0, 0.0, 0.0)で赤色になる
color = mix(WHITE, BLACK, step(edge, x));
```

mix関数は第3引数の値に応じて、第1,2引数の値を文字通りミックスしてくれるものですが、**step関数は0.0か1.0しか返さないので、1つ目か2つ目のどちらかが返ってきます。**

# でも何か分かりづらい
step関数の用法はこんな感じです。

ですが、個人的に思うのは、
**条件を満たしたら0.0じゃなくて1.0の方が直感的**
って事です。

そこで、最近は以下のルールで考えるようにしています。

## x >= edge
```glsl
// x >= edge なら 1.0
step(edge, x);
```

これはリファレンスの説明にある`0.0 if x < edge, else 1.0`の意味を逆にした考えですね。

## x <= edge
```glsl
// x <= edge なら 1.0
step(x, edge);
```
引数の順番を逆にすれば`>=`が`<=`になりますね。

## x < edge
```glsl
// x < edge なら 1.0
// vec4の場合
vec4(1.0) - step(edge, x);
```

今度はリファレンスの説明にある`0.0 if x < edge, else 1.0`の結果の方を逆にします。
注意点としては、`vec4(1.0)`の部分の次元を合わせるようにしてください。

## x > edge
```glsl
// x > edge なら 1.0
// vec4の場合
vec4(1.0) - step(x, edge);
```

同じく引数の順番を逆にすれば`<`が`>`になります。

# まとめ
|x >= edge   |x <= edge   |x > edge          |x < edge          |
|:-----------|:-----------|:-----------------|:-----------------|
|step(edge,x)|step(x,edge)|1.0 - step(edge,x)|1.0 - step(x,edge)|

とりあえず、この４パターンを頭に入れておくと良いと思います。

一応、動作確認用のデモを「[GLSL Sandbox](http://glslsandbox.com/e#37003)」に置いてあるのでこちらも参考にしてみてください。

# 引数の次元に注意

ひとつ注意したいのは、
`T step(float edge, T x)`
はできても、
`T step(T x, float edge)`
はできないという事です。

```glsl
vec4 v4 = vec4(1.0, 0.75, 0.5, 0.25);
vec4 result;

// 1つ目がベクトルなら2つ目もベクトルにしないとダメ
// result = step(v4, 0.5);

// ベクトルの次元を合わせればOK
result = step(v4, vec4(0.5));
```

その場合は素直にベクトルの次元を合わせましょう。

# おまけ

最後にもう一つ。

`==`と`!=`はどうするの？

と思った方、答えは以下です。

## x != edge
```glsl
// x != edge なら 1.0
abs(sign(x - edge));
```
`sign`は引数の符号を返す意味で、値が正なら`1.0`、負なら`-1.0`、値がゼロなら`0.0`を返します。
それを`abs`で絶対値にすれば`1.0`か`0.0`になります。
そして、`x`と`edge`の差分を渡す事で、`x != edge なら 1.0`の意味になります。

## x == edge
```glsl
// x == edge なら 1.0
// vec4の場合
vec4(1.0) - abs(sign(x - edge));
```
結果を逆にすればOKです。


それでは、良きGLSLライフを！
Android端末の開発者モードをONにする方法

AndroidOSのバージョンや端末により異なりますので、異なる場合は「お手持ちの端末名　開発者モード」などで検索してみて下さい。


［設定］の［端末詳細］に［ビルド番号］という表示があるので、そこを連続でタップして下さい。ハイパーオリンピックバリに連打です。

<img width="300px" alt="Screenshot_20161127-152509.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/4addd4bc-8b62-b275-4b24-a8fa1c525b81.png">

「これでデベロッパーになりました！」と表示されたらOKです。
<img width="300px" alt="Screenshot_20161127-152538.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/348831d3-cea4-777d-239a-3c51d10a2665.png">

[設定]に戻ると[端末情報]の上に[開発者向けオプション]が追加されています。
<img width="300px" alt="Screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/dd5cc9a2-9fa2-21d1-2f6c-9bec524d5f94.png">

アプリ開発をする場合には[開発者向けオプション]のUSBデバッグもONにしておきます。
<img width="300px" alt="Screenshot_20161127-152555.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/338aace5-e39f-f82e-093f-744cd876d467.png">
CodeIQ「『ディビジョン・サム』問題」に参加しました。


[CodeIQ「『ディビジョン・サム』問題」](https://codeiq.jp/challenge/2903)の掲載期限が終了したということで、自分の提出コードを公開します。ほかの解答者のコードは[Togetter](http://togetter.com/li/1049668)にまとめらているので、ぜひご参考に。

```py3
"""
「ディビジョン・サム問題」(https://codeiq.jp/challenge/2903)の解答コード。

== 方針 ==

とある整数の約数の和は素因数分解を利用することができる。
たとえば整数mが次のように素因数分解できるとする: m = p^2 * q^3
このとき整数mの約数の和は (p^0 + p^1 + p^2) * (q^0 + q^1 + q^2  + q^3)

本問では巨大な整数n!^nを素因数分解を行う必要がある。
n!^n = 1^n * 2^n * ... * n^n であるから、1^n, 2^n, ... n^nを順番に因数分解することで、
最終的にn!^nの素因数分解の結果を求めることができる
"""


import collections, math

def prime_division(x):
    """
    x > 0を満たす整数に対して素因数分解を行う。
    戻り値はkeyが素数、valueが指数となるような辞書。
    """
    ht = collections.defaultdict(int)
    for factor in range(2, int(math.sqrt(x)) + 1):
        if x == 1: break
        
        while x % factor == 0:
            ht[factor] += 1
            x //= factor
    
    if x != 1: ht[x] += 1
    return ht


def geometric_sequence_sum(a, r, n):
    """
    初項a,公比rの等比数列について第1項から第n項までの和を求める。
    """
    return (a * (r ** n - 1)) // (r - 1)


def f(n):
    """
    問題文中のF(n).
    """
    
    # 1^n, 2^n, ... n^nについて素因数分解を行い、n!^nの素因数分解を行う。
    factors = collections.defaultdict(int)
    for x in range(2, n + 1):
        for prime, exp in prime_division(x).items(): factors[prime] += exp * n
    
    # (p^0 + p^1 + ... ) * (q^0 + q^1 + ...) * ... を求める。なお(p^0 + p^1 + ...)は等比数列である。
    ans = 1
    for prime, idx in factors.items():
        ans = ans * geometric_sequence_sum(1, prime, idx+ 1) % (10 ** 6 + 3)
    return ans

if __name__ == '__main__':
    n = int(input())
    print(f(n))

```

正直なところ解答ソースコードに書いた以上のことはないのですが、少しだけコメントしておきますね。

「『ディビジョン・サム』問題」はざっくりいうと__「巨大数の約数の和を求める」__という内容でした。整数の約数の和は素因数分解を利用して求めることができるということはよく知られています(大学受験などでは頻出ですね)。よって本問題は__「与えられた巨大数をどれだけうまく素因数分解できるか」__という点に集約できます。巨大数を愚直に生成して、それから素因数分解をする――という方法ではいうまでもなくうまくいきません。したがって愚直解ではなく、より洗練された方法に気が付くかという点が本問の肝だったように思います。
Mathematicaで数表のハイライト

便利なやつからいきます。

テーブルをグリッド表示する際、特定の条件式に当てはまるセルをハイライト表示します。

```hilight-table.nb
highlightTable[tbl_, crit_, color_: Red] := 
 Grid[tbl] /. {n_?crit -> Item[n, Background -> color]}
```

例として、$x \times y - 1$ が素数となるセルを着色するコードを示します。

```prime-q--x-times-y.nb
tbl = Table[x y - 1, {y, 10}, {x, 10}];
highlightTable[tbl, PrimeQ]
```

このように表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/6117/3ccc3ada-3a7c-556f-c02e-79183b834473.png)

1行で書き下すと以下のようになります。

```prime-q--x-times-y--one-line.nb
Grid[Table[x y - 1, {y, 15}, {x, 15}]] /. {n_?PrimeQ -> Item[n, Background -> Red]}
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/butchi_y">@butchi_y</a> (More info: <a href="https://t.co/HBUuaZOB3w">https://t.co/HBUuaZOB3w</a>) <a href="https://twitter.com/hashtag/wolframlang?src=hash">#wolframlang</a> <a href="https://t.co/20gTy9WjpC">pic.twitter.com/20gTy9WjpC</a></p>&mdash; Tweet-a-Program (@wolframtap) <a href="https://twitter.com/wolframtap/status/804330002036719617">2016年12月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Angular + webpack + bootstrap の開発環境構築①

webpackを使ったフロント周りの環境について備忘録の意味も含めてまとめることにしてみました.

第1弾として、node.jsの環境と、npmでのパッケージの準備までを行うことにします。


# 前提条件
macでの開発を前提として書いています。

# Node.js の環境を整える

```
curl -L git.io/nodebrew | perl - setup
```

~/.bash_profile に nodebrew の Path を追加する

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

pathを反映させる

```
source ~/.bash_profile
```

nodebrew でinstall 可能versionの確認

```
nodebrew ls-all
```

v6.7.0を install する場合は、

```
nodebrew install-binary v6.7.0
```

ローカルにinstallしたnodeのversionを確認する

```
nodebrew ls
```

使用するnodeのversionを指定する

```
nodebrew use v6.7.0
```

nodeの確認を行う

```
node -v
npm -v
```


# npm で webpack, angular, bootstrapを用意する

環境によっては、グローバルへのinstall を行えない場合もあるため、 
webpack,angular,bootstrapは、すべてローカルにinstallを行うことにします。

```
npm init -y
npm install webpack --save-dev
npm install jquery@2.2.4 --save
npm install angular --save
npm install bootstrap --save
```

# webpackでのコンパイルを行えるようにする.

npm は、node_moduleのpathが通っているので、npmのscriptとして、webpackを登録しておく。

package.jsonは、こんな感じ

```
{
  "name": "angComp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "echo webpack",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "angular": "^1.5.8",
    "bootstrap": "^3.3.7",
    "jquery": "^2.2.4"
  },
  "devDependencies": {
    "webpack": "^1.13.3"
  }
}
```


# 次回予告
webpackの設定とコンパイルするとこまではまとめいきます。

[Angular + webpack + bootstrap の開発環境構築①](http://qiita.com/TKR/items/d886c584925a291b785e)
[Angular + webpack + bootstrap の開発環境構築②](http://qiita.com/TKR/items/0a0eb0b25a72eb16134f)
[Angular + webpack + bootstrap の開発環境構築③](http://qiita.com/TKR/items/a6556d2b84318648ef4d)

### 2016年12月21日 追記
nodebrew の install 方法ですが、curlではなく、Homebrew でもinstall ができることに気がつきました。

```
$ brew install nodebrew
```

Homebrew で install すれば、パッケージ管理も楽になるの個人的にはHomebrew で入れる方をお勧めいたします。

注意)
 Homebrew で入れても、nodebrew の current に選択されているnodeにpathが通っていないため、.bash_profileなどに下記のpathを通す必要はあります。

```
$ export PATH=$HOME/.nodebrew/current/bin:$PATH 
```
vSRX はじめ

Juniper のトレーニングを受講した際、vSRX が入ったUSBメモリを頂いたので、VMware Fusion にデプロイした記録です。

* [vSRX 仮想ファイアウォール](http://www.juniper.net/jp/jp/products-services/security/srx-series/vsrx/)

* [評価版のダウンロード](http://www.juniper.net/us/en/dm/free-vsrx-trial/)


頂いた USB メモリには VMware 用の ova ファイルと KVM 用の jva ファイルが格納されていました。

1. VMware Fusion 起動
2. 仮想マシンのライブラリ から ファイル -> インポート
3. vSRX の ova ファイルを選択
4. 仮想マシンを起動
![vSRX01.png](https://qiita-image-store.s3.amazonaws.com/0/133546/2e99465c-30b9-3400-c7a1-a775518387b5.png "vSRX01.png")

これでもう SRX が試せます。

-----

[公式の親切なスライド](http://www.slideshare.net/JuniperJapan/vsrx-laptop-201505)があるので、デプロイ手順の記事は不要ですが、SRA Advent Calendar で自動化について書く予定なので、シリーズ第一回ということで、、
nginx ファイルアップロードできない・・・

アップロードボタンを押したら500エラー発生！
Railsのエラーログには何も出てないし、
unicornのエラーログにも何も出てこない。

・・・

うわーどうしよう！
そうだ、nginxだ。
早速エラーログ確認。

```
open() "/var/lib/nginx/tmp/client_body/0000000016" failed (13: Permission denied)
```

`/var/lib/nginx`の所有者が`/etc/nginx/nginx.conf`のuserになっていないのがいけませんでした。

```
$ sudo chown -R 【user名】 /var/lib/nginx
$ sudo service nginx reload
```

これにて無事解決。めでたし。
Programming Language F*

こんにちは

F# のアドベントカレンダーの記事ということで、F# の話題を楽しみにされた方々には申し訳ないのですが、この記事では F* というプログラミング言語を紹介します。F* は「えふすたー」と読みます。

公式サイトは以下になります。

* [F*: A Higher-Order Effectful Language Designed for Program Verification](https://fstar-lang.org/)

なんだか論文とかおいてあってやたらハイソな感じがしますね。それもそのはず、開発にはマイクロソフトリサーチが関わっています。

* [The F* Project - Microsoft Research](https://www.microsoft.com/en-us/research/project/the-f-project/)

いったんここで「なぜ F* を取り上げたのか？」について説明しないとそろそろ F# の記事を期待されている方たちから石が投げられそうな気がしますので説明させていただきますと、基本的には F* は F# とよく似た言語ですし、なんと **F* で書いたプログラムは F# に変換することができる[^1]のです！** 

[^1]: なんか他にも最適化のために[C言語のコードに変換できたりもする](https://github.com/FStarLang/kremlin)みたい

言ってみればマイクロソフトの尖った野郎ども[^2]が作ったイケてる Alt F# なんですよ。

[^2]: マイクロソフトリサーチ以外にも MIT や INRIA みたいな大学からのコミットも多いみたいです

メインの領域としては定理証明などを想定しているみたいです。Agda とか Coq みたいなのに近いんですかね。

ここで F* の驚きのコードを…紹介できればよかったんですが、じつは私、これ書けないんですよ！！！

でも、[論文(PDF)](https://www.fstar-lang.org/papers/mumon/paper.pdf)がなんかヤバくって

<img width="344" alt="Screen Shot 0028-12-01 at 22.51.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/1644/44c358b4-4462-b70d-1ba3-7791a807da69.png">


うわー、なんかすごいことができそう。

<img width="332" alt="Screen Shot 0028-12-01 at 22.52.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/1644/ac11e281-bff8-b86e-ad61-f1c17d29d44a.png">

読んでもぜんぜん分かりません！

はいー、心折れました。

ポキリンコッ！！！

そんなわけで、お客様の方々におかれましては F# に詳しい方もいらっしゃるでしょうから、ぜひこの言語を使ってみて、素晴らしさを私に教えて下さい。

どうぞよろしくお願いします！


うわー、石投げないでおくれぇ〜
UnityでVRのAndroidアプリをビルドする方法

[ディップ Advent Calendar](http://qiita.com/advent-calendar/2016/dip-dev)の２日目担当の大屋です。

普段はディップ株式会社でネイティブアプリエンジニアとして働いています。

先日、都内某所で開催されたVRイベントで初めてVR体験しました。
![VR.png](https://qiita-image-store.s3.amazonaws.com/0/126555/3ab00606-60b9-8504-25a4-81b639a5af6a.png)

イベントの最後にVR体験会があって運よく体験できたんですが、ヘッドセットをつけると目の前には見たことない世界が広がってました。

今日お話ししたいのはUnityでVRアプリ(Android)を簡単にビルドする話を紹介していきます。

# VRの開発環境構築
まずは環境構築です。

- [Unityのダウンロードとインストール](https://store.unity.com/ja/download?ref=persona)
    - 推奨は5.4.2です。最低でもGoogle VR SDK for Unityが対応している5.2.1が必要です。
    - Unityインストール時のオプションでAndroid Build Supportも追加コンポーネントも同時にインストールしておく
- [Google VR SDK for Unityのダウンロード](https://github.com/googlevr/gvr-unity-sdk/raw/master/GoogleVRForUnity.unitypackage)
- [ユニティちゃんのデータダウンロード](http://unity-chan.com/download/download.php?id=UnityChan&v=1.2)
- AndroidStudioとJavaのインストール

# 仮想空間に物体配置
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/126555/180018b8-e63b-cb95-1b45-d885d47a8575.png)

続いて、仮装空間に物を配置していきます。
今回配置したのは地面となる平面、中心に四角、Unityのマスコットキャラのユニティちゃんです。


# 平面上をランダムで移動する動作を追加する。
物体を配置できたら、独自スクリプトをキャラクタにセットします。
どのような処理をコーディングしているかというと、キャラクタが歩いていく行き先を乱数で平面上のどこかに設定して、５秒たったら再度設定して平面上を行ったり来たりするようにしています。

下のファイルはその時のコードとなります。

```C#:MoveControl
using UnityEngine;
using System.Collections;

public class MoveControl : MonoBehaviour {

	RaycastHit hit;
	Ray ray;
	NavMeshAgent agent;
	Animator animator;

	// Use this for initialization
	void Start () {
		agent = GetComponent<NavMeshAgent> ();
		animator = GetComponent<Animator> ();
		StartCoroutine (RePositionWithDelay());
	}

	IEnumerator RePositionWithDelay() {
		while (true) {
			SetRondomPosition ();
			yield return new WaitForSeconds (5);
		}
	}

	void SetRondomPosition() {
		float x = Random.Range (-5.0f, 5.0f);
		float z = Random.Range (-5.0f, 5.0f);
		Debug.Log ("X,Z: " + x.ToString("F2") + ", " + z.ToString("F2"));
		agent.SetDestination( new Vector3 (x, 0.0f, z));
		animator.SetFloat ("Speed", 0.2f);
	}

	// Update is called once per frame
	void Update () {
		if (agent.destination == transform.position) {
			animator.SetFloat ("Speed", 0.0f);
		}
	}
}
```

# build and Run
最後に実行です。

UnityのFile>BuildSettingを選択して表示される画面でplatformにAndroidを選択してBuild&Runすればオッケーです。

![スクリーンショット 2016-12-01 22.50.16.png](https://qiita-image-store.s3.amazonaws.com/0/126555/7a2cebe6-0160-fc3c-76b2-89635cbfa246.png)

# 終わりに
今回、ご紹介したのはAndroidアプリでVRアプリの作る時のざっとした流れでした。
VR体験するには対応する携帯端末が必要だったり、VR用のヘッドセットが必要だったりしますが、とても身近な存在になりつつあるなと感じています。ご興味ある方是非やって見てください。
pythonでyamlの扱い

# 概要
pythonでyaml扱う際に，ブロックスタイルで書き込む方法
使用するのはPyYAMLです

# 読み書き
こんなyamlファイルがあったとします

```yaml
test1: test
test2: test
```

読み込みは以下のように，辞書型で読み込めます．

```python
>>> import yaml
>>> f = open("test.yml", "r+")
>>> data = yaml.load(f)
>>> data
{'test1': 'test', 'test2': 'test'}
```

書き込むときは，以下のように`dump()`で書き込みます．

```python
>>> data
{'test1': 'test', 'test2': 'test'}
>>> f.write(yaml.dump(data))
>>> f.close()
```

書き込まれたtest.ymlを見ると以下のようになっており，期待通りではありません．
非常に見づらい．

```yaml
test1: test
test2: test
{test1: test, test2: test}
```

# ブロックスタイルで書き込み
フロースタイルではなく，ブロックスタイルで書き込むには，`dump()`時に`default_flow_style=False`を設定します．

```python
>>> f.write(yaml.dump(data, default_flow_style=False))
```

```yaml
test1: test
test2: test
test1: test
test2: test
```

期待通りになりました．

# OrderedDictを使って書き込む
`dump()`でインスタンスオブジェクトをyamlに変換した場合，インスタンスオブジェクトのタグが出力される問題があります．
例えば，OrderedDictとか
それは
[PyYAMLでyamlをload/dumpする時の振る舞いを変えてみる方法とその詳細について
](http://qiita.com/podhmo/items/aa954ee1dc1747252436)に詳しく書かれていました．

# 参考
http://gihyo.jp/dev/serial/01/yaml_library/0003
http://blog.panicblanket.com/archives/1076
iOSのプッシュ通知の表示文字数


自社の[iOSアプリ](https://itunes.apple.com/jp/app/yenta-wan-quan-shen-zha-zhiaibijinesumatchinguapuri/id1062187493)の開発時、プッシュ通知の表示について軽く調べる機会があったのでメモ。ロック画面や通知バナーに表示できる文字数を知りたかったのだが、ググラビリティが低くて発見できなかったため、実際に通知を送ってカウントした。

## 通知のペイロード長制限
その前に、前提となる情報を確認。

[ローカル通知／リモート通知プログラミングガイド](https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html)などに記載があるが、APNsの通知のペイロードに含められるデータの最大長は、 **4KB**。（※iOS9以上）

また、WWDC2016で[発表された](https://developer.apple.com/videos/play/wwdc2016/708/)ように、iOS10からは画像や動画付きプッシュ通知も送信できるようになった。

このあたりは調べると出てくるのだが、実際にアプリの利用者が目にする、ロック画面・通知バナーetc.に最大どれくらいの文字が表示されるかが今ひとつ分からなかったのであった。。。

## ロック画面/通知バナーにどれくらいの情報量が表示されるか
### 画像・動画なしの場合
というわけで、適当な文章をプッシュ通知のペイロードに入れて実験してみた。

（↓ 自分の使っているiPhone 6s (iOS10)で試したところ）
 
<img src="https://qiita-image-store.s3.amazonaws.com/0/1795/bcb6f885-5351-4efe-70c2-5c079b2eb770.png" width="300" />

> [太宰治 走れメロス](http://www.aozora.gr.jp/cards/000035/files/1567_14913.html)


開発時に考慮している最小サイズのiPhoneは、iPhone SE / iPhone 5s。また、対応しているOSのバージョンはiOS9 / iOS10なので、それらを満たす機種で確認した。

結果は以下の通り。truncateされていない部分の文字数をカウントしている。

|       | ロック画面 / 通知センター | 通知バナー             |
|-------|---------------------------|------------------------|
| iOS10 | 全角78文字, 半角157文字   | 全角37文字, 半角78文字 |
| iOS9  | 全角83文字, 半角158文字   | 全角45文字, 半角88文字 |

※iPhone 5sサイズの機種で確認


ちなみに、プッシュ通知の「タイトル」を入れても、文字数が減ることはなかった。

#### 番外: 3D touchのPop時
全角341文字の文章を送信したが、送った全文が表示された。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1795/bf5ae375-2ae4-f777-51a0-2b032e55468c.png" width="300" />

### 画像・動画付きの場合
TODO: 調べる

## おわり
アプリのユーザが目にするプッシュ通知に関して、最大何文字まで表示できるか知っておくのは大切なので、調査してみて良かった。iOS10になって、表示可能な文字数が減ったんですね。

というわけで、だいぶなライトな感じになってしましましたが終わり。
Ubuntu14.04にtorchも入れてみる

##はじめに
これまで、ChainerやTensorFlow、CaffeやTheanoなどをインストールした。ここにきてTorchも入れる必要が出たので、インストールする。

Torchホームページの手順に従って進める。
http://torch.ch/docs/getting-started.html#_

##環境
GPU:GTX1070
OS:Ubuntu14.04
CUDA:8.0 RC
cuDNN:5.1
python2.7.6など

##インストール済みパッケージ
Chainer
TensorFlow
Theano
Caffeなど

##dependenciesをインストールする
まずホーム直下にgit cloneして、必要なdependenciesを入れる。

```
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch
bash install-deps
```

##Trochをインストールする
次にインストールする。

```
./install.sh
.....
.....
Do you want to automatically prepend the Torch install location
to PATH and LD_LIBRARY_PATH in your /home/ohmasa/.bashrc? (yes/no)
[yes] >>> 
yes
```

最後にbashrcにPATHを書いたろか？と聞いてきたので、yesとした。PATHを有効にする。

```
source ~/.bashrc
```

##動作確認する
ちゃんとインストール出来てるか、動作確認する。

まずthと打って試してみる。

```
th
 
  ______             __   |  Torch7 
 /_  __/__  ________/ /   |  Scientific computing for Lua. 
  / / / _ \/ __/ __/ _ \  |  Type ? for help 
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch 
                          |  http://torch.ch 
	
th> torch.Tensor(1,2,3)
(1,.,.) = 
  0  0  0
  0  0  0
[torch.DoubleTensor of size 1x2x3]

                                                                      [0.0005s]	
th> 
                                                                      [0.0000s]	
th> exit
Do you really want to exit ([y]/n)? y
```

何をやったかイマイチわからんが、うまく動作してるみたい。

次に`test.sh`を実行する。

```
./test.sh
.....
.....
160/169 VolumetricDilatedMaxPooling_backward_batch ...................... [WAIT]THCudaCheck FAIL file=/home/ohmasa/torch/extra/cutorch/lib/THC/generic/THCStorage.cu line=65 error=2 : out of memory
160/169 VolumetricDilatedMaxPooling_backward_batch ...................... [ERROR]
161/169 SpatialReplicationPadding_forward ............................... [ERROR]
162/169 PReLU_forward ................................................... [PASS]
163/169 SpatialConvolutionMM_backward_batch ............................. [PASS]
164/169 RReLU_forward ................................................... [PASS]
165/169 ClassNLLCriterionMultipleTargetWeights .......................... [PASS]
166/169 Sigmoid_forward ................................................. [PASS]
167/169 Sqrt_forward .................................................... [PASS]
168/169 Sqrt_zero ....................................................... [PASS]
169/169 TemporalConvolution_backward .................................... [PASS]
Completed 1903 asserts in 169 tests with 0 failures and 2 errors
--------------------------------------------------------------------------------
VolumetricDilatedMaxPooling_backward_batch
 Function call failed
.....
.....
 An error was found while running tests!
```

最後の方でエラーが出た。`max pooling`の`backward`計算あたりで問題が発生したみたい。`out of memory`と出てるのでGPUのmemory不足だろうか？

ネットで検索してみたが、ここ
https://github.com/karpathy/neuraltalk2/issues/52
など読むと、データのサイズを下げることで対応できるので、今回のインストールは成功したものとみなす。
Kinoma CodeとKinoma Elementを触ってみる

SXSWで気になって大量購入してから、ずっとサボっていたKinoma。
Kinoma Codeをとりあえず触ってみることにした。

Kinomaとは何か？という話はまたいずれ。

参考にしたのはこのサイト
http://kinoma.com/develop/documentation/element-quick-start/

まずはKinomCode開いてみる。

#### １）まず電源を供給する
使えるWiFiが見当たらない場合、自動的にアクセスポイントモードになるので、
ちなみにKinoma Elementはすでに技適が通っているので安心して使えます。

ここでまずトラブル？1回目。上記URLのページではアクセスポイントモードになろうとするときは
Kinoma ElementのLEDが緑に光ると書いてあるのに青に光っている。。。
まあ、信号も青信号といいながら緑だから、緑＝青として解釈して放っておこう。

#### ２）ホストPCのWifiでアクセスポイントとなっているKinoma Elementを選択

ここでトラブル2回目。上記URLのページではアクセスポイント名が「KinomaElement-＊＊＊＊」でキャプチャがでてくるが、



![select-device.png](https://qiita-image-store.s3.amazonaws.com/0/19420/6d50a334-f325-8414-0a30-714789977f94.png)


そんなの全然出てこない何か怪しい「K05＊＊＊＊＊」というアクセスポイントがパスワードなしでつなげたのでとりあえずそれを選ぶ。

KinomaCodeのNetScannerで「Kinoma Shell」というのが出てきたのでとりあえずこれで間違いなさそうだ。
※どうやらワタシのはファームウェアが古いバージョンみたいでそのときはKinomaElement-****なんてWifi

#### ３）デバイスの選択でKinoma Elementを選択

上記URLのページでデバイス選択で「Kinoma Element」せよと書いてあるが、出てこない。
中々出てこない。。。イライラして再起動しようとしたら表示された。
どうやら時間がかかるようだ。
とにかくこれでKinoma Elementを選んで、Kinoma Elementの設定ができるようになった。

#### 4)Kinoma Elementで使うWiFiを設定する

Kinoma Elementに接続できたら、KinomaCodeから使うWiFiを選択するが
ここは特に問題なかった。
![join-wifi.png](https://qiita-image-store.s3.amazonaws.com/0/19420/e2bcb3bd-68be-6aba-7ead-82f0e89ad2ec.png)

しかし、接続後、Elementが再起動してまた表示されるというが出てこない、、、
なぜ？とりあえずPCをのWiFiを元に戻したら（KinomaElemntも繋いでいるWiFiに繋ぐ）
表示された。

#### 5) Kinoma Softwareをアップデート
この次にKinomaCodeの設定からKinoma Softwareをアップデートしようと「Apply」ボタンを押したら
アップデート失敗。。
何度やっても失敗する。

私の場合は0.99だった。これが原因なのだろうか。

とりあえず放置してサンプルプロジェクトをつくって「HelloWorld」アプリを起動しようとしたら
「run」ボタンが押せない。。。

これじゃ何もできないやないかい！と思っていろいろ検索したら以下のポストを発見した。
http://forum.kinoma.com/discussion/680/new-element-update-from-0-99-7-to-2-0-0-fails

初期バージョンのKinoma Elementには問題があったみたいで、
なんとこれを見るとホストPCにUSBでつないで「/dev/cu.usbmodem***」で入って対応する必要があるとのことでした。確かにKinomaElementをUSBでPCと繋いだら選択デバイスに「/dev/cu.usbmodem***」が出てきました。
※ちなみに初期バージョンはLEDが「青」に光るのがデフォルトだったみたいで、目の錯覚ではないようです。

![AZv3A2I.png](https://qiita-image-store.s3.amazonaws.com/0/19420/1fb6ac4f-3eeb-1888-0f1a-1d12ee8dc4f0.png)


そしてKinomaCodeで
```
update
```
と叩けばいいみたいです。

が、上記ポストの投稿者同様
```
event: shutting down
inetd: socket.onClose for 8081
inetd: stopping...
wlan: disconnected
[wlcm] Warn: got event: deauthentication
wm_wlan_disconnect: remove network error = 3
```
となってしまいました。

しかし、wifiコマンドとprintenvコマンドで見る限り動いたので問題なさそうです。
WifiからKinomaElementにつないだらKinomaSoftwareのバージョンも無事2.04になっていました。
あとはQuickStartページの「Starting a Project in Kinoma Code」のとおりにsampleプロジェクトをつくってmain.jsをrunすれば普通にconsoleで「Hello World」が表示されました。

というわけで今回はここまで。ぜんぜんKinoma.JSの話ができなかった。。。
次はもっとちゃんと書きます。

そういやKinoma HDってどうなった？
Webサイトから消えているし、無かったことにしているのかな。
はじめてのNSL 15分でHello World

#NSLとは
日本のOverTone社が開発管理してるハードウェア記述言語(HDL)｡世界初のHDLであるSFLを改良した言語｡普及してるVerilogHDLやVHDLより短くかける｡
同期式回路に絞って開発されたSFLをもとにしているのでclockとresetは省略できる｡
もちろん非同期式回路も書ける｡(頑張ればファミコンやスーファミが作れる)
書いたNSL(SFL)はVerilogHDL,VHDL,SystemCに変換できる
http://www.overtone.co.jp/wp_overtone/support/faq/developer/

#ダウンロードとインストール
![2016-11-30_00h07_32.jpg](https://qiita-image-store.s3.amazonaws.com/0/70435/38062b42-b729-95a0-8203-af4327f1956e.jpeg)
http://www.overtone.co.jp/

# エディタは何を使えばいい
私も知らない｡eclipseが用意されてるらしいけどDLページにないから購入者だけなのかな?