OmniAICreator/Qiita-1.07M huggingface dataset:
動的なテーマで、スタイリングを楽にする（メモ）


## 問題

- UX: 午前中で、```Theme.AppCompat.Light```を利用し、しかし、寝る前に目に優しく利用したいから```Theme.AppCompat```に切り替えたい。
	- 今回は、テーマとともに、textColorを動的に切り替える

- 開発者側：（あくまでも自分が今まで）よくやっているのがこうなる

```xml:style.xml
<resources>
	
	<!-- Dark theme -->
	<style name="TextAppearance.MyDarkTheme.Small" parent="TextAppearance.AppCompat.Small">
        <item name="android:textColor">@color/text_color_dark</item>
    </style>
    
   	<!-- Light theme -->
	<style name="TextAppearance.MyLightTheme.Small" parent="TextAppearance.AppCompat.Small">
        <item name="android:textColor">@color/text_color_light</item>
    </style>
    
</resources>
```

```xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    
    <!-- Default theme is Light -->
    <TextView 
	    ...
    	android:textAppearance="@style/TextAppearance.MyLightTheme.Small"
    />
    
</RelativeLayout>
    
```

```java:MainActivity.java

// onCreate()
// 1. getTheme value from Preference
// 2. call setTheme for current Activity
// 3. change TextAppearance on specific TextViews <-- ここでテキストのスタイリングを切り替える
// ...

```

## 解決

```xml:style.xml
<resources>
	
	<!-- BEGIN: Custom attributes -->
    <attr name="myCustomTextColor" format="color"/>
    <!-- END: Custom attributes -->
    
	<!-- Dark theme -->
	<!-- Base application theme. -->
    <style name="MyTheme.Dark" parent="Theme.AppCompat">
        <item name="myCustomTextColor">@color/text_color_dark</item>
    </style>
    
   	<!-- Light theme -->
    <style name="MyTheme.Light" parent="Theme.AppCompat.Light">
        <item name="myCustomTextColor">@color/text_color_light</item>
    </style>

	<!-- 一つのスタイリングだけでオッケー -->
	<style name="TextAppearance.MyTheme.Small" parent="TextAppearance.AppCompat.Small">
        <item name="android:textColor">?attr/myCustomTextColor</item>
    </style>
    
</resources>
```

```xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    
    <!-- Default theme is Light -->
    <TextView 
	    ...
    	android:textAppearance="@style/TextAppearance.MyTheme.Small"
    />
    
</RelativeLayout>
    
```

## 終わりに

その他に、カスタマイズなものがあれば同じく〜。２つ以上のテーマをサポートしたい時に、楽
vimで制御コード

制御コードをhexで表示する。

```
:set binary
:set display=uhex
```

制御コードを入力するには、`CTL+V`+`CTL+<制御コード>`

主なコード

- `^I` 0x09 水平タブ
- `^J` 0x0A 改行
- `^K` 0x0B 垂直タブ
よく設定されていないalias8選！


# 概要
前回の[よく設定されているalias](http://qiita.com/hirooooooo/items/5c47fdaf40fc1d3b702f)の続編として今回よく設定されていないんだけど、便利なaliasを紹介していきます。選定基準はGithubから「alias」で検索をかけ独断と偏見で選んでいます。
※今回Macでのaliasを想定しています

# alias一覧

## １. alias hs='history | grep '
そういえばこれまで過去入力したコマンドを調べる時に、`history | grep ◯◯`はかなりの回数実行してきましたが、これを設定しておけば楽ですね。。早くに設定しておけばよかった。

```
$ hs git
  590  git push origin master
  596  git add .
  597  git commit -m "test"
  597  git push origin master
  608  git shortlog -n -s
```

## ２. alias ql="qlmanage -p 2>/dev/null"
ファイル名を引数としてMacのquick lookでそのファイルを確認でます。いちいちFinderを起動しなくても、ターミナル上から起動できるので作業効率がアップします。

## ３. alias mute='/usr/bin/osascript -e "set volume 0"'
ボリュームをmuteにします。Macであれば、専用のキーを押せばいいんですがｗ
何か他のコマンドと組み合わせた時に、威力を発揮するかもですね。

## ４. alias reload='source ~/.bashrc'
bashrcの設定を変更した際にreloadとうつと反映されるようになります。

## ５. alias pwp='pwd|pbcopy'
カレントディレクトリのパスをクリップボードにコピーします。

## ６. alias imgdim='sips -g pixelHeight -g pixelWidth $1'
macの固有のコマンドのsipsを使って指定した画像ファイルの縦横サイズを調べます。

```
$ imgdim 画像ファイル名
  pixelHeight: 56
  pixelWidth: 309
```

## ７. alias gip="curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'"
GIPの確認が行えます。

## ８. alias clock='while :; do printf "%s\r" "$(date +%T)"; sleep 1 ; done'
現在の時間を表示して、1秒間隔で更新します。

# まとめ
今回出てきたものをまとめますと下記になります。よければコピーしてご利用ください。

```.bashrc
alias hs='history | grep '
alias ql="qlmanage -p 2>/dev/null"
alias mute='/usr/bin/osascript -e "set volume 0"'
alias reload='source ~/.bashrc'
alias pwp='pwd|pbcopy'
alias imgdim='sips -g pixelHeight -g pixelWidth $1'
alias gip="curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'"
alias clock='while :; do printf "%s\r" "$(date +%T)"; sleep 1 ; done'
```
SphereBlurでThetaの360°写真にボカシをかける

去年、Theta Sを買って遊んでたんだけど、ボカシをかける機能がAndroid版公式アプリに無い。そこで、冬休みに時間が有ったので、ボカシをかけるためだけの[SphereBlur.com](https://sphereblur.com)というWebアプリを作った。

[![sphereblur.com](https://media.giphy.com/media/l0NwujqeGhDcB0ses/giphy.gif)](http://www.youtube.com/watch?v=UweKPfLnZFY)

これを作るために下記のような技術的に面白そうなことをしたので、備忘録も兼ねて記事を書いた。

- ServiceWorkerとCache APIを使ったオフライン対応: http://qiita.com/horo/items/175c8fd7513138308930
- Manifestを使ったAdd-to-homescreen対応: http://qiita.com/horo/items/ff665e4a6613e7684f8f
- WebGLのフラグメントシェーダを使ったミラーボール反射: http://qiita.com/horo/items/83afb83d60f63c57217c
- JPEGファイルからXMPメタデータの取得: http://qiita.com/horo/items/895a838bac2d9e762c88
- [JPEGEncoder](https://github.com/owencm/javascript-jpeg-encoder)のXMPメタデータ出力対応: http://qiita.com/horo/items/a53d5749df3018772133
AWS Certificate Manager (ACM)で申請前に事前に確認しておくべき大切なこと

AWS Certificate Manager (ACM)がリリースされました！

[New – AWS Certificate Manager – Deploy SSL/TLS-Based Apps on AWS](https://aws.amazon.com/jp/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/)

2016年1月現在、AWSのELBとCloudFrontのみでの利用かつ、リージョンもus-east-1だけではありますが、無料で利用できるSSL証明書(ワイルドカードも対応可能）で更新も自動ということでかなり良さげなサービスです！

で早速使ってみようと思ったら、盛大にはまってしまったのでメモ。

# 結論

ACMでの **申請前** に必ず申請ドメインでのメール受信(送信されるメールアドレスは後述)が出来ることを確認してから申請を行いましょう!!!!!


ACMではSSL申請がされたドメインを本当にユーザーが持っているか確認するために **メール** を送るのですが、自分の場合、最初にメール受信設定をしてなかったため到達できず、バウンスが発生し、しかもそれを何回もやってしまったため、最終的に申請対象ドメインでの承認用メールが送信されない状態になってしまったようです。。。（サブドメインはできた）

# 詳しく

ACMでSSLのドメイン申請を行うと以下のメールアドレスに一気にメールが送信されます。

+ SSL申請ドメインのwhoisした時のDomain registrant、Technical contact、Administrative contact
+ administrator@your_domain
+ admin@your_domain
+ hostmaster@your_domain
+ postmaster@your_domain
+ webmaster@your_domain

your_domainの部分は申請したドメイン名になります。例えば`hoge.com`で申請した場合には以下のようになります。

+ administrator@hoge.com
+ admin@hoge.com
+ hostmaster@hoge.com
+ postmaster@hoge.com
+ webmaster@hoge.com

whoisの内容についてはお名前.comなどでwhoisの情報公開代行をやっている場合には、お名前.comで設定したメールアドレスになっているので、事前にadmin@your_domainなどで受信できることを確認しておきましょう。

自分の場合、メール設定をすることを知らず、申請後に気づき、しかもメール受信設定がうまくできておらず、何回も再送信メールなどを送ってしまったことが問題だったと思われます。。

# 自分のやってしまったこと

+ とりあえず、ACMでSSLの申請
+ その後、メールの受信後のリンクによってSSLの承認することを知る。メール受信設定はやってなかった。。。
+ 独自ドメインのメール受信をやったことがなく、設定を何回もミスし、その都度ACMから再送信メールを送ってしまった
+ AWS SESで独自ドメインによるメール受信ができように設定
+ Gmailからadmin@your_domainへのメール送信し、SESで受信できる所まで確認
+ ACMから再申請メールを送る。送信はOKと出るが一向にSESで受信できない
+ 試しにサブドメインでのSSL申請(sub.your_domain)でSESの受信設定後、ACMで申請をやったらすんなり受信<-イマココ

ということで上記より、受信できない状態でメールを何回も送ってしまったことによって発生したのではないかと思っております。(マネージメントコンソール上は特に何も出ないのでですが。。。）

# 気になること

今、ドメイン名のみでの承認メールがうまく送信できない状態になってしまったっぽいけど、いつになったら大丈夫になるんやろか。。。。

(2017.03.2追記)
設定を行ってから2日程度経過後、再送信をしてみたらメールが受信できました
hubotでbabel(es2015)する



hubotのスクリプトもes2015で書きたくなったときに。

まずはbabelでes2015する準備。

`npm i --save babel-core babel-preset-es2015`

でbabelを入れて、`.babelrc`に

```json:.babelrc
{
    "presets": ["es2015"]
}
```

hubotの本体はbabelでラップされたものがあるのでそれも入れる。

`npm i --save babel-hubot coffee-script`

そして起動スクリプトのhubotコマンドを叩いている所をbabel-hubotを使うように修正。

`node_modules/.bin/babel-hubot`

これでscripts以下のファイルはes2015で書けるようになる。

ついでに`npm i --save babel-plugin-add-module-exports`を入れて`.babelrc`を

```json:.babelrc
{
    "presets": ["es2015"],
    "plugins": ["add-module-exports"]
}
```

とすれば`module.exports = function ...`の代わりに`export default function ...`のように書けます。

`Promise`が使いたくなったら`npm i --save babel-polyfill`を入れ、scripts以下に`_init.js`の様な名前で

```js:_init.js
// Description:
//   モジュールローダー等
'use babel'
import 'babel-polyfill'
export default function(){}
```

というファイルを作成する。
hubotはscripts以下のファイルを名前順に読み込むので、一番最初に読み込まれるファイルにポリフィルを書いておけば続くスクリプトファイルでPromiseが使えるようになる。
いじけるなベッキー で分かる高階関数

# 思ってること

- ベッキーはキャリアが長くて、とても仕事が出来ると思っています。
- 昨今の件は、まぁなんか色々あったけど、彼女の後釜いないんじゃないですかね。 ~~SH◯LLY、ホ◯ン千秋？、う〜ん....~~
- 何となく高階関数やらブロックってわりかし壁っちゃ壁なのかな、と思って、書いてみました。

# 開発者なら開発者らしくベッキーにエールを送ろうではないか！！！！

## メッセージ

**ちょっと今CMとか 打ち切られてるだろうけど いじけるなベッキー**

## Ruby編

#### 定義と呼び出し

- 定義

```rb
def becky
  puts "ちょっと今CMとか"
  yield
  puts "いじけるなベッキー"
end
```

- 呼び出し

```rb
becky{ puts "打ち切られてるだろうけど" }
```

**実際にやってみる**

```
$ pry
[1] pry(main)> def becky
[1] pry(main)*   puts "ちょっと今CMとか"
[1] pry(main)*   yield
[1] pry(main)*   puts "いじけるなベッキー"
[1] pry(main)* end
=> :becky
[2] pry(main)> becky{ puts "打ち切られてるだろうけど" }
ちょっと今CMとか
打ち切られてるだろうけど
いじけるなベッキー
=> nil
```


## JavaScript編

```js
> var shelly = function(){ console.log("打ち切られてるだろうけど"); }
> var becky = function(fn){ console.log("ちょっと今CMとか");  fn.call(); console.log("いじけるなベッキー"); }
> becky(shelly)
```

**実際にやってみる（スクショりました）**

<img width="776" alt="Screen Shot 2016-01-25 at 07.19.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/46303/1b59eb0c-5c8a-8a1b-1527-f857897edf91.png">

# Q. これ、yieldやら使う必要あるんですか？

**あるわけがない**

# See Also

[THEE MICHELLE GUN ELEPHANT - いじけるなベイベー](https://www.youtube.com/watch?v=rG1vuyz6Fb0)
技術英語 > almost [comparable] in value to the cleared forest > One hour of work in the morning is comparable to three hours of work in the evening (at night).

@ LOE > October 12, 2012
http://loe.org/shows/shows.html?programID=12-P13-00041
> to make the standing forest at least <font color=red>almost comparable in value to </font>the cleared forest

<hr>
http://eow.alc.co.jp/search?q=comparable&ref=sa
> comparable to
《be ～》～と比較できる［可能である］
《be ～》～に相当［匹敵］する

「朝一時間の知的作業は、夜の三時間の作業に匹敵する」from 40歳からの勉強法 by 三輪裕範さん

上記を英訳してみると
~~The work in the morning is comparable to the work in the evening (at night).~~

One hour of work in the morning is comparable to three hours of work in the evening (at night).

上の英訳はまさに夜に英訳したもので、１時間や３時間の用語が抜けていた。失敗。下の訳は寝起き（今）英訳したもので、多少は良くなったと思われる。

in valueをつけるべきかは未消化。
Docker Swarm上のdocker runで認証付きリポジトリを使う


dockerのimageを認証付きのリポジトリに置いている場合、docker swarm上でdocker runをすると、以下のエラーを吐いて`docker pull`をしてくれません。これは、`docker login quay.io`をしていても同じです。
※今回はquay.ioを例に進めます。
```
$ docker run quay.io/my/repository
Error response from daemon: Error: Status 403 trying to pull repository my/repository: "{\"error\": \"Permission Denied\"}"
```

通常のDocker Engine上では`docker login quay.io`でログインした後、`docker run quay.io/my/repository`をするとimageが手元になければ勝手に`docker pull`して引っ張ってきてくれます。

swarm上で`docker pull quay.io/my/repository`とすれば、pull自体はできるのですが、クラスタ内の全てのマシンで`docker pull`が走ってしまいます。

この問題が、`swarm:1.1.0`では修正されたようです。
https://github.com/docker/swarm/releases

`~/.docker/config.json`に`X-Registry-Auth`を書いておく事で、実際にコンテナが作成されるホスト上だけで`docker pull`が走るようです。
https://github.com/docker/swarm/blob/master/docs/api/swarm-api.md#registry-authentication
Ubuntu14.04 でマザボ交換後Wifiが無効化されてしまった時の対処法

# はじめに
Precision M3800 の出荷時にマザボの不具合があったらしく、マザボ交換後した。
そうしたらなぜかWifiが有効にならず、アイコンには「無線はハードウェアのスイッチで無効になっています」と表示され続けている。そんなハードのスイッチなどない。

Windows8とのデュアルブートをしているが、Windows側では問題なく起動する。

とりあえずちょっと検索して一般的にやることをやってみるが何故かうまく行かない。

```bash
rfkill list
```
で、

```bash
Soft blocked: no
Hard blocked: yes
```

と激しく主張されている。

```bash
rfkill unblock all
```

をして再起動しても変わらない。BIOSの設定にもそれらしい項目はない。

# 解決手段
システム設定→ネットワーク→無線　をONにする。以上。
![Screenshot from 2016-01-25 04:39:32.png](https://qiita-image-store.s3.amazonaws.com/0/110138/7f4bb8b5-a214-96d7-bb98-9599b813fe22.png)


「ハードウェアのスイッチ」に引きずられていました。ハードがブロックされていて、ソフトの設定を見直すとよいようです。

マザボを交換しただけでこの設定が変わった理由までは、分かっていません。
Restangularを使ったAngularJSアプリケーションが動かなくなった...


表題の通りのメモです。時間が解決してくれると思いますが、ひとまずメモ。
（AngularJS 1.x系 + Restabgular利用での環境になります。また、20160125時点です）

### 起きたこと

- Restangularを使っているAngularJSベースのアプリケーション
- 2016年はじめまでは問題なかった
- 1月半ばに新規の環境でbower install後動かそうとしたら、画面がちゃんと表示されない...
- JavaScriptのコンソールを見ると、「TypeError: _.contains is not a function」なメッセージが出ている

### なぜ？

- Restangularが依存する[lodashに4.0.0へのバージョンアップ](https://github.com/lodash/lodash/wiki/Changelog)があったため
 - lodashバージョンアップについての日本語での記事
 - [2016-01-13のJS: jQuery 2.2、lodash 4.0.0、IE8サポート終了](http://jser.info/2016/01/13/jquer-2.2-lodash4.0-ie8/)
- 関連Issue: [Lodash 4.0 TypeError: _.contains is not a function](https://github.com/mgonto/restangular/issues/1294)

underscore.jsとの統合も検討しているそうで、関数のリネームや統廃合があった模様。

現在、廃止になった関数の置き換えのPull Requestが出ているので、そちらが組み込まれれば問題は解決すると思われます。（2016/01/25時点では未だ）

### ひとまず対策

[restangular/issues/1294](https://github.com/mgonto/restangular/issues/1294) にある通りに、まずはlodashのバージョンを明示して4.0xを利用しないようにしました。

```
bower uninstall restangular
bower uninstall lodash
bower install --save lodash#3.10.1
bower install --save restangular
```

さて、実際のところ、わたしはlodashが何のために使われているか把握していなかったのですが、Restangularの処理に必要だったということで、勉強になりました...。

現在出ているPull Requestは [こちら](https://github.com/xeor/restangular/commit/16d69aff50a9182d7582836388f6e403851673ca) になります。
廃止された _contains という関数は、includes という関数のエイリアスだったので、そちらを向けば大丈夫のようです。

### 覚え書き

これからもちょこちょこありそう。
JS周りは修行中の身ですが、自分でちゃんと情報をキャッチしていかないといけませんね...
【PyEnv】Python3.5.xを入れられない対策

## はじめに

ちょっと新しい環境を手に入れたのでPython3.5.1を入れようと思ってドブにハマって解決できたのでシェア

### 環境

- Mac OS X 10.10.5
- PyEnv

## 問題

```bash
$ pyenv install 3.5.1
Downloading readline-6.3.tar.gz...
-> https://yyuu.github.io/pythons/56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43
Installing readline-6.3...
Installed readline-6.3 to /Users/nnsnodnb/.pyenv/versions/3.5.1

Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...

BUILD FAILED (OS X 10.10.5 using python-build 20151222-8-g5c5205e)

Inspect or clean up the working tree at /var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169
Results logged to /var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169.log

Last 10 log lines:
  File "/private/var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/ym/w77_0x8n6kx0bbnbz1s4sp_00000gs/T/python-build.20160125040015.59169/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

みたいな感じでエラーがでる

## 解決方法

`zipimport.ZipImportError: can't decompress data; zlib not available`
このエラーメッセージでググったらIssue出てきた

[Python 3.5 Issue #454 | GitHub](https://github.com/yyuu/pyenv/issues/454)

> @nikolay I had the same issue, and was able to fix by updating command line tools on OSX. Just run xcode-select --install

> Once, that's finished, you should be able to install 3.5.0

こんな感じなことが書いてあった。`Xcode command line tools`を入れろということらしい

```bash
$ xcode-select --install
```

入れて差し上げる

## 確認

```bash
$ pyenv install 3.5.x  # xはお好みで
```

インストールが終わったら`pyenv rehash && pyenv global 3.5.x`とかやる。
それで`pyenv versions`や`python -V`とかで確認して無事インストールができていることを確認

## 最後に

GitHubのIssueを見る限りどうやらPython3.5.x系のときに出ているらしいですね。
command line tools自体は入れておいて損はないと思うから別にいんですけどねw
lineのurlスキームで簡単な注文システムを作ってみた

#<i class="fa fa-cubes" style="font-size:1em;"></i>はじめに
※LINEを商用利用する場合はLINE@を使う必要があります。

どーも、初投稿のpio2です。
python大好きな終末プログラマ(自称)です。

知り合いが持ち帰りの飲食店をオープンしたのでbootstrapのテンプレートをいじってwebサイトを作ってあげたのですが、その際に表題について思いついたので作ってみました。
まだサイトは公開してないのですが、どんな感じで作ったかを書きたいと思います。

初心者ですのでご意見あればどしどしください(^o^)/
#<i class="fa fa-check-circle" style="font-size:1em;"></i>LINEのURLスキーム
urlスキームを使用するとスマートフォンのブラウザからLINEを起動し、メッセージを送ることができます。

詳細は
[https://media.line.me/howto/ja/](https://media.line.me/howto/ja/)

テキストを送る場合はCONTENT TYPEをtextにし、CONTENT KEYに送りたいテキストの内容にする。
例えば、hello world!なら　
line://msg/text/hello world!
とする。

CONTENT KEYに注文内容がある程度簡単に入力できるようになれば、簡易な注文システムができるんじゃないかと思ったのが作ったきっかけです。
#<i class="fa fa-code" style="font-size:1em;"></i>htmlのform selectとjavascriptのlocal.hrefで簡単注文システムを作る
流れはこんな感じです。

数量を選択する
↓
それをurlのCONTENT KEYに渡す
↓
local.hrefでそのurlに飛ぶ
↓
LINEが起動し、メッセージの送信先（お店）を選択する
↓
メッセージが送信される

```html
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <script>
		function line_message(){
		            var order_sea_food = document.order.sea_food.value;
		            var line_url = "line://msg/text/" + order_sea_food;
		            location.href = line_url;
		            }
	</script>
</head>
<body>シーフード 
  <form name="order">
    <select name="sea_food">
      <option value="">0</option>
      <option value="シーフード1枚">1</option>
      <option value="シーフード2枚">2</option>
      <option value="シーフード3枚">3</option>
    </select>
    <br>
    <input type="button" value="LINEで送る" onclick="line_message() ">
  </form>
</body>
<html>


```

実際はもう少し商品の種類や選択数量が多く、自由記載のコメントや来店時間があったり、入力がない場合や来店時間がメッセージの投稿時間より前でないかのロジカルチェックを入れました。
LINEを起動してからはメッセージ内容が投稿後にしか確認できないためconfirmを使いブラウザでメッセージ内容を確認した後にLINEが起動するようにしました。

あと、input type="submit"とすると動かなかった。
ネットで調べるとbuttonとsubmitは一緒って書いてるのに。なぜだろう？
#<i class="fa fa-bomb"style="font-size:1em;"></i>作ってみて感じたこと
長所

* サーバーサイドを一切準備せず注文システムが作れる
* データの受け渡しがスマホ内のためセキュリティーとかあんまり気にしなくてもいい
* LINEは多くの人のスマホに入っているため使うことに抵抗が少ない


短所

* LINE＠は無料で月に1000通しか送れない（お客からメッセージが送られ、店側が返信して注文完了というシステムにしたかったので1000件までしか注文が受けられない）
* ロジカルチェックのアラートやconfirmがあるため、safariに「このサイトは頻繁に通知を送ってくる」と怒られる
* 普通に入力されて送られてきたメッセージと区別できない
* いたずらで送られてくると対応できない（アカウントが電話番号と紐づいてるので少ないとは思う）
* 知り合いが機械オンチのためお蔵入になる可能性大

最初は購入金額が計算できるようにしようと思ったのですが、通常入力のメッセージと区別ができないため金額の改竄がおこなわれトラブルになる可能性があると思いやめました。
#<i class="fa fa-search-plus"style="font-size:1em;"></i>おわりに
スマホで何かする＝スマホアプリって風潮な気がするが、機能の少ないアプリや使用頻度の低いアプリをスマホにDLしたくないのは私だけ？
この位の機能ならwebで十分だし、みんな大好きLINEに乗っかってもいいんじゃないでしょうか。

あと、option valueが数違いでいっぱいある場合みなさんどうしてるんですか？
javascriptのdocument.writeの中に書いてループして使ってるんですか？
私は最初コピペで数字だけ変えてたんですが、3行目でバカらしくなってpythonでprintをループさせて一気につくってコピペしました。

ご意見おまちしてまーす。
MacのターミナルやiTermでのJavaエラーメッセージ文字化け解消

新しくMacbook買ったので環境構築して遊んでたら

```
java --version
```

でjavaが導入されてるのを確認できたけど

```
javac test.java
```
でコンパイルメッセージ文が文字化けしてるのを発見。
デフォルトだとSJISになってるらしいからUTF8に変更してやる必要があるっぽい。

# .bash_profileを作成


.bash_profileとは何かというと
ユーザがMacやLinuxにログインすると、ホームディレクトリにある.bash_profileが実行されるようになっています。

```
cd ~
```

でホームディレクトリに移動して、
.bash_profileを作る。
デフォルトでは.bash_profileは作成されてないのでからファイルから作る必要があります。

```
vi .bash_profile
```

で、

```lang:.bash_profile
alias javac='javac -J-Dfile.encoding=UTF-8'
alias java='java -Dfile.encoding=UTF-8'
```

すぐに反映させたい場合には

```
source .bash_profile
```
Go 1.6 でポインタをcgoの関数へ渡す際の注意点

一次ソースはこちら→ https://github.com/golang/proposal/blob/master/design/12416-cgo-pointers.md そのうち誰かが訳してくれると信じています

# 前提

- この記事では、Goで確保されたメモリへのポインタを`Goポインタ`とする[^1]
- この記事を書いている時点では、Go1.6はbeta2のため、まだ変わるかもしれない
- Goで確保されたメモリはGCされたり、将来的には自動で移動するようになるかもしれない[^2]
- C側で確保されたメモリはGCされない。将来的な自動移動も行われない

# Go1.6からどうなるか

- Goポインタをcgoの関数へ引数として渡すと、そのcgoの関数から返ってくるまでそのポインタが指すメモリは保護[^3]されGCされたり移動したりしなくなる

# そのため、下記の点を注意する必要があります

- cgoの関数の引数経由以外の方法でGoポインタをCに渡した場合は、そのGoポインタが指すメモリは保護されない
- cgoの関数から返ってくると保護されていたGoポインタの保護も外れるため、cgoの関数内でGoポインタをどこかに保存して次に呼ばれたcgoの関数内で再利用とかはできない
- GoポインタへのGoポインタをcgoの関数に渡すのは基本ダメ
    - 保護されるのは引数で渡されたGoポインタが指す先のみで、その指す先の更に指す先は保護されない
    - go1.6beta2では、cgo関数呼び出し時のチェックに引っかかって[`cgo argument has Go pointer to Go pointer`](https://github.com/golang/go/blob/efd93a412eb5941d767b70097e93a589747de34f/src/runtime/cgocall.go#L395)というエラーメッセージが表示される 
    - Cで確保されたメモリへのポインタへのGoポインタならOK。Cで確保されたメモリはGC対象ではないため
- GoポインタへのGoポインタがダメなのと同じ理由で、Goポインタをフィールドに持つ構造体へのGoポインタをcgoに渡すのも基本ダメ

---
[^1]: こちらで定義されているのの直訳→ [we define a Go pointer to be a pointer to Go memory](https://github.com/golang/proposal/blob/a3c90bbfd94cdec0c55c97d320e6707c64ac9f64/design/12416-cgo-pointers.md#background)
[^2]: 自動で移動するようになるかもって書いてある→ [If a later garbage collector implements moving pointers,](https://github.com/golang/proposal/blob/a3c90bbfd94cdec0c55c97d320e6707c64ac9f64/design/12416-cgo-pointers.md#rationale)
[^3]: `be pinned`と書いてある箇所を「保護」と訳しました。こちら参照→ https://github.com/golang/proposal/blob/a3c90bbfd94cdec0c55c97d320e6707c64ac9f64/design/12416-cgo-pointers.md#consequences
ATコマンドとモデム通信


# AT コマンドとは

ATコマンドは米国ヘイズ社によって開発されたモデムを制御するコマンド

AT～～のようなコマンドをPC入力することにより、通信することができる。

# モデムと通信との関係

3G通信はATコマンドでモデムを制御している。

自局 → モデム側 SEND
自局 ← モデム側 RECV
の関係において

linuxではpppdがATコマンドを駆使して、
モデムを制御してくれている。

# cuｺﾏﾝﾄﾞ

LANケーブル以外の媒体やインターフェイスなどを使って、他のコンピュータなどに接続し、情報の入力や表示を行うコマンド。

cuで接続語、ATｺﾏﾝﾄﾞを実行できる。

-l で使用するデバイス名を指定できる。

/dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyACM0など。

※ ACMはAbstract Control Modelの略でUSBの規格の一つ

http://www.eleki-jack.com/Kurobox-pro2/2007/08/cu.html

```shell-session
# cu -l /dev/ttyACM0
Connected.
at ← atｺﾏﾝﾄﾞで、モデムからの応答があることを確認
OK
~.　←cu コマンドの終了
Disconnected.
#
```

http://www.gadgety.net/shin/tips/unix/ppp.html
http://freebsd4-jman.kandk.co.jp/1/cu.1.html

# 参考

* [Link Control Protocol (LCP)](http://tools.ietf.org/html/rfc1661.html)
*  [The PPP Internet Protocol Control Protocol (IPCP)](https://tools.ietf.org/html/rfc1332)
* http://itpro.nikkeibp.co.jp/article/COLUMN/20080715/310887/
* http://www.gadgety.net/shin/tips/unix/ppp.html
* http://oshiete.goo.ne.jp/qa/280940.html
* [ATコマンドでの電波強度](http://m2msupport.net/m2msupport/atcsq-signal-quality/)
* [ModemManagerでの電波強度](https://users.atmark-techno.com/node/2321)
* [モデムの設定をしたりどこにでも電話したり等するには dialout グループに所属する必要がある](https://www.debian.org/doc/manuals/debian-reference/ch01.ja.html)
matplotlibでグラフの文字サイズを大きくする

# デモ
|Before|After|
|:--:|:--:|
|![sc0.png](https://qiita-image-store.s3.amazonaws.com/0/40987/4e6592af-4775-66b5-64b4-0afe77187750.png)|![sc1.png](https://qiita-image-store.s3.amazonaws.com/0/40987/1e9b5902-b7b1-7916-d1c2-709e4c3e9740.png)|

# 方法① 別々に文字サイズを指定する
各グラフ要素はキーワード引数`fontsize`に数値を与えることで、その数値の文字サイズになります。ただし、目盛りの文字サイズの場合は、`plt.tick_params(labelsize=18)`と指定します。

```py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
s = np.sin(x)
c = np.cos(x)

plt.plot(x, s, "r", label="sin")
plt.plot(x, c, "k", label="cos")
plt.title("Title", fontsize=18)
plt.xlabel("xlabel", fontsize=18)
plt.ylabel("ylabel", fontsize=18)
plt.legend(fontsize=18)
plt.tick_params(labelsize=18)

plt.savefig("output.png")
```

# 方法② まとめて文字サイズを指定する
```py
plt.rcParams["font.size"] = 18
```
で、全てのグラフ要素の文字サイズをまとめて変更することができます。なお、デフォルトの文字サイズは`12`です。（Thanks to [Tsutomu-KKE@github](http://qiita.com/Tsutomu-KKE@github), 2016/01/26）

# おまけ
## グラフ位置の調整
各グラフ要素の文字サイズを大きくした副作用でグラフの一部が出力画像からはみ出てしまうことがあります。そこで、

```py
plt.tight_layout()
```

を加えることで、グラフの位置やサイズが自動で調整されて、出力画像からのはみ出しを抑えることができます。

|修正前|修正後|
|:--:|:--:|
|![1.png](https://qiita-image-store.s3.amazonaws.com/0/40987/f873df8e-4e9a-4203-2e9b-d72bf46b022d.png)|![2.png](https://qiita-image-store.s3.amazonaws.com/0/40987/51d63cc0-3f06-be01-0a55-ae44090346db.png)|

## コピペ用
```py
plt.rcParams["font.size"] = 18
plt.tight_layout()
```

#参考
matplotlib入門 - りんごがでている
http://bicycle1885.hatenablog.com/entry/2014/02/14/023734

Tight Layout guide — Matplotlib 1.5.1 documentation
http://matplotlib.org/users/tight_layout_guide.html
Middlemanで「変更なし」「作成」「削除」「変更」の状態を取る

静的サイトジェネレーターの[Middleman][]でサイトをビルドすると、ビルドされたファイル名が「変更なし」「作成した」「削除した」「変更した」といった状態変化とともに並びますよね。
![Middlemanでビルドするとファイルの状態変化も表示される](https://gyazo.com/9abd49e4837bddd0c52f6f5ed7056ebd.png)
ビルドしたファイルをS3に上げてウェブサイトとしてホストさせてたりすると、余計な通信を減らすためにもこの情報を有効活用したいものです。

公式サイトのドキュメントを見ていてもその方法は載っていないのですが、[カスタム拡張][]を作ることで簡単にこれを取得できます。

この状態変化の情報は、ビルダーの`on_build_event`というタイミングのコールバックで取得できます。このコールバックはカスタム拡張の`before_build`メソッド内で設定できます。

```ruby
class CatchChange < ::Middleman::Extension
  def before_build(builder)
    @mode = mode = Hash.new {|mode, event_type| mode[event_type] = []}

    builder.on_build_event do |event_type, target, extra|
      p event_type # => :identicalなど
      p target     # => #<Pathname:build/2015/11/06.amp.html>など、出力先のパス
      p extra      # => nil 「on_build_event」では常にnil

      case event_type
      when :identical
        # 変更なし
      when :created
        # 新規作成
      when :deleted
        # 削除
      when :updated
        # 内容の変更
      end

      # こうしておくとafter_buildなんかで@modeを参照することでこの情報を使える
      mode[event_type] << target
    end
  end
end
```

検索エンジンに情報を入れるために、更新したか否かを知りたくて調べてました。でも使わないことにしたので、コードに残らず、忘れてしまいそうなので残しておきます。ただ、アンドキュメンテドなので、予告なく変わったり無くなったりするかも知れません。

[Middleman]: https://middlemanapp.com/jp/
[カスタム拡張]: https://middlemanapp.com/jp/advanced/custom_extensions/
~/.profileにRubyを仕込んだらsshログインが遅くなった

環境：Arch Linux

~/.profileにこんなRubyコマンドを仕込んだだけでsshログインが遅くなった（約1分。通常は1秒もかからない）。

```
which ruby
ruby --version
ruby -e 'puts "Hello"'
```

```
Last login: Mon Jan 25 01:06:45 2016 from 133.202.119.196

/usr/bin/ruby
```

と、ここまで表示されてから次の`ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]`が表示されるまで約1分かかる。

遅いのはリブート直後の初回sshログインだけで、2回目以降は速い。初回であっても、リブートから数分待ってからログインすれば速い。

何かの起動待ちかタイムアウトしているのだと思うけど原因は不明。
ProtocolExtensionを利用して画面遷移拡張プロトコルの基底処理を実装してみたサンプル

## 概要

`ProtocolExtension`の学習がでらに画面遷移時にパラメータを渡すような処理を実装してみたサンプルです。

アイデア自体はObjCで上司が書いた画面遷移カテゴリを参考にしています。

## ProtocolExtensionについて

プロトコルに基底の処理を実装できるSwiftの機能です。[APIKit](https://github.com/ishkawa/APIKit)などのライブラリで型制約したリクエストをつくる際に利用方法されていたりします。

## まずはProtocolの実装

ViewControllerから呼び出して遷移するためのメソッド `showViewController` は`<T:RoutingProtocol>`を追加して`RoutingProtocol`に準拠したViewControllerと、コメントで頂きましたParam型のパラメータしか利用できないよう制約をつけています。

`setupWithParams`はパラメータを受け取るためのメソッドです。

```swift

protocol RoutingProtocol{

    typealias Param = AnyObject

    /**
     pushViewcontroller with any argument

     - parameter viewController: conform to RoutingProtocol
     - parameter params:        any argument
     */
    func showViewController<T:RoutingProtocol>(viewController:T, params:T.Param?)

    /**
     By overridden by viewController conforming to RoutingProtocol,
     and receives parameters from the transition source

     - parameter params: any arugument
     */
    func setupWithParams(params:Param?)
}
```

## つづいてProtocolExtension

基底の処理を実装します。

```swift
extension RoutingProtocol where Self: UIViewController{

    func setupWithParams(params:Param?) {}

    func showViewController<T:RoutingProtocol>(viewController:T, params:T.Param?){
        viewController.setupWithParams(params)
        guard let vc = viewController as? UIViewController else{
            print("cast failure")
            return
        }
        self.navigationController?.pushViewController(vc, animated: true)
    }
}
```

**ポイント1**

setupWithParamsはプロトコルに準拠したViewControllerがオーバーライドしたときのみパラメータを受け取れるように中身を空で実装しています。引数を受け取る必要のないViewController等は実装の手間が省けます。

**ポイント2**

`func showViewController<T:RoutingProtocol>(viewController:T, params:Param?)`で型制約を行うことで`RoutingProtocol`に準拠したViewControllerと引数を受け取って`setupWithParams`メソッドを呼び出し、パラメータを渡すことができます。

今回は実装してませんがnavigationControllerを持っている前提の遷移処理になっていますので無い場合は追加するなり、モーダルにするなりの対応が必要ですかね。

### 利用方法

遷移元は勿論、遷移先であるDetailViewController()もRoutingProtocolに準拠していることが`showViewController`メソッド呼び出し時に求められます。渡すパラメータは DetailViewControllerで指定しているStringでないと怒られます。

```swift
class ViewController: UIViewController, RoutingProtocol {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func showDetailDidTap(sender: UIButton) {
        self.showViewController(DetailViewController(), params:"anything")
    }
}
```

遷移先

Param型の指定を行うことで `setupWithParams`で受け取りたいパラメータの型制約をしています。

```swift
class DetailViewController: UIViewController, RoutingProtocol{

    // parameter type Constraints
    typealias Param = String

    // MARK: override

    func setupWithParams(params: Param?) {
        print("\(params!)")
    }

}
```

[プロジェクトファイルはこちら](https://github.com/satoshin2071/Samples/tree/master/Projects/RoutingExample)

### 参考にさせて頂きました。ありがとうございます。

* [SwiftのProtocolExtensionでBaseViewControllerの肥大化を解決！そして、必ず抑えておきたいデメリット](http://qiita.com/yukiasai/items/527cfad09a6cdf1f3abf)

* [APIKit](https://github.com/ishkawa/APIKit)
ポートを開放して外部からアクセスできるようにする

# Arch Linuxでポートを開放する．
sshdは`systemctl start sshd`するだけでうまく行くのに，自分でウェブサーバを起動して外部からアクセスしようとしてもウンともスンとも言わないので戦った記録．
Arch Linuxで自作のサーバを建てたいんだけどポート開放がうまく行かない人向け．

# 結論

0.0.0.0を使ったら一瞬だった．0.0.0.0と127.0.0.1の違いを理解していなかった自分がアホだった．
恥ずかしいからこの記事も消したいけど一応ハマっている人がいるかもしれないから残す．かと言って127.0.0.1でハマる人なんかがサーバを立てるとも思えないので，この記事があっても生き恥をさらすだけで意味ないのかもしれない．

# 戦いの記録

Arch Linuxでは[一般的な推奨事項](https://wiki.archlinuxjp.org/index.php/%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%8E%A8%E5%A5%A8%E4%BA%8B%E9%A0%85)に

> ## ファイアウォールの設定
> ファイアウォールは Linux のネットワークスタックの上部で拡張保護レイヤーとして働きます。Linux カーネルには Netfilter プロジェクトのひとつで、ステートフルファイアウォールである iptables があります。利用するにはフロントエンドを使うか、直接設定します。Arch では全てのポートが閉じられており、ネットワークデーモンは設定をしないかぎり自動で起動しないため、保護すべきサービスがない限りファイアウォールはあまり意味がありません。

とあるので，iptablesを起動して全部ACCEPTにしたりしてもポートがオープンになりませんし，そもそもArchはデフォルトでiptablesを起動しないと[iptables](https://wiki.archlinuxjp.org/index.php/Iptables)に書いてあります．

これに気づくまでにだいぶ時間がかかりましたが気づいてからは早かったです．
まず，

> ネットワークデーモンは設定をしないかぎり自動で起動しないため、

とありますが，対偶を取ると，「自動で起動しているネットワークデーモンは設定をしている」ということになります．
よって，冒頭で記述したsshdはパッケージに設定ファイルが入っているので，何もしなくても22番ポートが開放されネットワークデーモンが起動しています．
そこで，/usr/lib/systemd/system/sshdを調べると，sshd.serviceとsshd.socketという怪しげなファイルが見つかります．
中を見ると

```:/usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target

[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and sshd@.service.
```

```:/usr/lib/systemd/system/sshd.socket
[Unit]
Conflicts=sshd.service
Wants=sshdgenkeys.service

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target
```

と書かれています．
しかし，ここで私は疑問が出てきました．自分のsshdではポートを22番から変えているのです．
試しに`systemctl status sshd.socket`してみるとinactive，つまり起動していません．このため22番ポートという設定が無視されてポート開放できているのです．
(余談ですが，この話も[Secure_Shell](https://wiki.archlinuxjp.org/index.php/Secure_Shell)に書いてあります)
つまり，なんかうまいこと.socket ファイルや.serviceファイルを作ってポートを開放させてあげれば自作サーバをArch Linux上で動かせるはずです．
いろいろググると[こんなページ](http://qiita.com/pasela/items/a387711c7a39c3aa4ec0)がヒットしまして，あと，[Systemd](https://wiki.archlinuxjp.org/index.php/Systemd)のページをちょろちょろ参考にすれば，

```:/etc.systemd/system/service-name.service
[Unit]
Description=Simple HTTP Proxy

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd localhost:接続したいポート
PrivateTmp=yes
```

```:/etc.systemd/system/service-name.socket
[Unit]
Description=Simple HTTP Proxy Socket

[Socket]
ListenStream=接続を受け付けるポート
```

```shell-session
systemctl start service-name.socket
```

を書くだけです．
詳しくは`man systemd-socket-proxyd`
例えば，httpサーバを8080番で受け付けて，外部から80番ポートにアクセスしてコンテンツを取得したい場合，接続したいポートに8080，受け付けるポートに80を書けば良い．
この方法が正しいかは知らないので，もしシステムをぶっ壊しても自己責任でお願いします．

書いて`systemd daemon-reload`して`systemd service.socket`とかすると普通に動いて今までのiptables諸々の苦労は何だったんだ…って感じになった．

ちなみに，sshd.socketが起動していないのになんで正しいポートを開放できてるのかは謎です．これがわかったらもっと簡単になるかもしれません．

わかったので更新しました．
Linux server で crontab の中身を安全に見る方法


定期実行のcron処理はcrontabに書いてある。
`crontab -l` で一覧を見ることが出来るが、`crontab -r`を誤発したら終わる（一切何の確認もなくcrontabが消去される、ヤバイ）し、実はこれ複数userがいる場合は使えない。`crontab -l -u admin` のように(例えば)adminユーザーの登録したjob、のようにしか参照できず不便である。

crontabの内容は`/var/spool/cron/crontabs`に書いてあるので、これを見てあげればいいというだけの話。
`cp /var/spool/cron/crontabs /tmp/crontab`とかして安全に見てあげましょう。
App Store公開前にアプリURLを知る方法

# 前書き

・WebページにiOSアプリのダウンロードリンクを貼りたい！
・でもまだアプリを公開してない。。。この場合でもURL知ることはできる？？

という状況だったのでいろいろと調べてみました。
結論から言うと取得できます。

# URLを知る

1. iTunesConnectにログインします。

2. マイAppをクリックします。
<img width="174" alt="スクリーンショット 2016-01-12 9.26.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/a9fb9b0a-89af-7498-6aa6-1abc3dd9f6ac.png">

3. 目的のアプリをクリックします。

4. 左メニューからAPP STORE 情報 - App 情報を選択します。
<img width="198" alt="スクリーンショット 2016-01-12 9.27.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/cab7125b-888b-d832-c278-e88766a5265b.png">

5. 下の方にある追加情報 - App Storeで表示をクリックします。この時のURLが今回求めるものの原型になります。
<img width="149" alt="スクリーンショット 2016-01-12 9.27.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/e4622a56-9787-aaad-b25e-b8c305bec17e.png">

PCでこのURLにアクセスすると、例えばChromeではこのような表示が出ます。
![スクリーンショット 2016-01-24 23.59.31.png](https://qiita-image-store.s3.amazonaws.com/0/100736/eaaebd1f-8b6c-3265-f82f-83324adaf6da.png)
ここで「アプリケーションの起動」をクリックするとiTunesが起動し、AppStoreのアプリページが開きます。
iPhoneでアクセスするとこんなかんじです。
![IMG_0220.PNG](https://qiita-image-store.s3.amazonaws.com/0/100736/a836fddd-6a02-4051-dcc4-0dcaa1ba94e7.png)

# App StoreのアプリURLの仕組み

URLは以下のようになっています。

`https://itunes.apple.com/[参照国コード]/[アプリ名]/[アプリid]?l=ja&ls=1&mt=8`

* 参照国コード
どの国のApp Storeを参照するかを指定します。デフォルトではusになっているようです。なので先ほど掲載したChromeのスクショは英語表記になっています。ここをjp(日本)に直すと日本のApp Storeのアプリページに飛びます。

* アプリ名
アプリ名が英字になったものが入ります。日本語の部分は基本的にはローマ字になるようなのですが、ローマ字になりきれていないものもありました。

* アプリID

* l=ja
表示言語のパラメータです。日本語の場合はjaが入ります。

* ls=1
lsはLoad Storeの略のようです。先ほどのURLにアクセスした時にiTunesを起動するか否かを設定するパラメータです。1を指定するとiTunesが起動する設定になります。
デフォルトでは1になっているため、先ほどのスクショで「アプリケーションの起動」や「App Storeで開く」の表示が出ていました。

* mt=8
mtはMedia Typesの略のようです。先ほどのURLがどのようなメディアの種類かを示すパラメータです。8はMobile Software Applicationsを表します。

[このページ](http://blog.geni.us/2013/12/06/parameter-cheat-sheet-for-itunes-and-app-store-links/)によるとこの他にもパラメータはあるようなのですが、普段気にするのは上記くらいではないでしょうか。

# 短縮URL

以下の形式で短縮URLが用意されています。
http://appstore.com/<アプリ名>
http://appstore.com/<開発者名>/<アプリ名>

ただし所定の文字列を除外するなどのルールがあるので、詳しく知りたい方は「参考」にあげているページをご参照ください。

# 参考

* [[iOS] 知っておいて損はない App Store のアプリのリンク URL についての Tips](http://dev.classmethod.jp/smartphone/iphone/app-store-url/)
* [ios - iPhoneアプリがApp Storeで公開されるURL について - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/6696/iphoneアプリがapp-storeで公開されるurl-について)
* [QA1633 貴方のアプリや会社を読み易くするApp Storeへの短縮リンクの作成](http://secondflush2.blog.fc2.com/blog-entry-1083.html)
Raspberry Pi2でフルカラーLED


## 環境情報

* Raspberry Pi2 Model B
* Raspbian JESSIE
* Python 2.7.9
* A/Dコンバータ MCP3008
* 半固定抵抗（〜100Ω）×３個
* RGB LED (共通端子アノード）
* 抵抗330Ω　×３個

## 目的

半固定抵抗を利用して、抵抗値に応じて点灯するLEDの色を変化させる。その際、PWMを用いてLEDへ送る電圧を擬似的にコントロールしLEDのR（赤）、G（緑）、B（青）のそれぞれのINPUTを調整させる。

## 用語説明

### PWM

PWMとは、Pulse Width Modulation パルス調変換のことで、信号の変調方式のこと。電圧を上げ下げする間隔を細かく調整することで擬似的に電圧を調整する方法。

## 事前情報

RGBフルカラーLEDは、一番長い端子がアノード（＋につなぐ）になっているものと、カソード（-につなぐ）になっているものがあるとのこと。ショップで購入した時に型番を控えなかったので、挿してみて確認したところ、アノードタイプだった。
プログラムのコードは、アノードで動作するようになってる。カソードの場合は、デューティ比のところを１００から引いた値にすれば良い。

## 回路

例のごとく回路図を電子的に描く術を知らないので写真で、、

![IMG_1868.JPG](https://qiita-image-store.s3.amazonaws.com/0/93861/892d9433-62b9-f40b-d527-31428d7a8b4e.jpeg)

### MCP3008

MCP3008 チャンネル８つを持つ10bitのA/Dコンバータ

[データシート](http://akizukidenshi.com/download/ds/microchip/mcp3008.pdf)

## プログラム

~~~
# !/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
from time import sleep
import spidev
import subprocess

def readacd(ch):
    resp = spi.xfer2([0x1,(8+ch)<<4, 0x00])
    value = ((resp[1]&3)<<8) + resp[2]
    return value

GPIO.setmode(GPIO.BCM)
LEDIN=25
LEDIN2=24
LEDIN3=23
GPIO.setup(LEDIN, GPIO.OUT)
GPIO.setup(LEDIN2, GPIO.OUT)
GPIO.setup(LEDIN3, GPIO.OUT)
p0=GPIO.PWM(LEDIN, 50)
p1=GPIO.PWM(LEDIN2, 50)
p2=GPIO.PWM(LEDIN3, 50)
p0.start(0)
p1.start(0)
p2.start(0)

# opne SPI device 0.0

spi = spidev.SpiDev()
spi.open(0 , 0)

try:
    while True:
        input0 = readacd(0)
        input1 = readacd(1)
        input2 = readacd(2)
        duty0 = 100 - (input0*100/1023)
        duty1 = 100 - (input1*100/1023)
        duty2 = 100 - (input2*100/1023)

        p0.ChangeDutyCycle(duty0)
        p1.ChangeDutyCycle(duty1)
        p2.ChangeDutyCycle(duty2)
        print("duty0:{:8}".format(duty0)+","+"duty1:{:8}".format(duty1)+","+"duty2:{:8}".format(duty2))
        sleep(1)

except KeyboardInterrupt:
    pass

p0.stop()
p1.stop()
p2.stop()
spi.close()
GPIO.cleanup()
~~~

readrcdでは、チャンネルを引数に渡している。チャンネル毎の値を取得するために引数の値を変更しながら、データを取得している。

結果は、[ムービー](https://youtu.be/StQhW-Okeso)で。

Ctrl+Cで終了すると、TypeError が出てしまいますが、解決策がわかっていません。誰か教えて、、
catを使った小技

## TL;DR

```shell-session
$ cat > test.txt
line1
line2
[Ctrl-D]
$ cat test.txt
# line1
# line2
```


## 前提：`echo`コマンドの不便さ

`echo`を使ってファイルに何かを書き込むというのはみなさんよくやってると思います。`echo`は特にスクリプト内で使われることが多いですが、インタラクティブに使うときには不便さが目立ちます。

特に問題になるのは改行の扱いです。`echo`のバージョンによって`-e`オプションを受け付けたりそうでなかったりするようです（参考までに、OSXの`man`ページでは`-e`オプションの記載がありませんでした）。このことから、`echo`で改行を扱うのはいささか厄介であるといえます。

まあ、複数行をファイルに書き込みたいなら`vim`なりなんなり使え、という方針はアリだと思いますが、あえてエディタを開かないことに固執したらどうなるでしょうか。

## `cat`コマンドを使う

`cat`の`man`ページを読むと、引数がない場合は標準入力から読み込むとあります。出力先は`echo`と同じく標準出力です。

詳細な仕様はわからないのですが（詳しい人教えてください）、`cat`コマンドを引数なしで実行すると、`cat`は「待受」状態に入り、`Ctrl-D`が押されるまでに入力されたテキストが標準出力に出力されます（ちなみに、`Ctrl-D`は`EOF`を入力します（[参考](http://d.hatena.ne.jp/higepon/20080602/1212385423)）標準入力はストリームですので、要はストリームが終わる（EOF）までに入力された内容をバッファしているということか）。

重要なのは、`cat`の待受状態でエンターキーを押下してもストリームは終了しないので、改行を含むテキストを出力できます。出力をファイルにリダイレクトすることで、ファイルに複数行のテキストを書き込むことができます。

## まとめ

`vim`使おう(´・ω・`)

…じゃなくて、`cat`を使うことで複数行のテキストをファイルに書き込めるよ！

## 愚痴

この辺の内容、標準ストリームだったりリダイレクトだったりを初心者向けに説明してる書籍ってあんまりないんですよね。`man`ページはここらへんのことは知ってる前提で書かれてるし…
配列の配列とポインタの配列

[前回の投稿](http://qiita.com/chesscommands/items/5460a72d70560083e583 "c言語の配列へのポインタ改良版")で知識が足りず,

> 個人的に*ptmp[]は多次元配列だと思っているのだが,宣言すら失敗してしまう.

という間違い発言をしてしまった.
丁寧に @angel_p_57 さんから[間違い発言](http://qiita.com/chesscommands/items/5460a72d70560083e583#comment-f851ad3ffe97bbacabf0)を訂正してくれました.

結論から言えば,私の頭で理解できる許容量を超えた出来事だと言うこと.
早速ソースコードをさらす.
最初の数行：D0〜D3は普通の配列
D：ポインタの配列
pp・hoge：配列の配列
boo：いわゆるダブルポインタ変数
pppp：配列へのポインタ

```c
#include <stdio.h>

int main(void){
	int D0[10] = {0};
	int D1[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
	int D2[10] = {2, 2, 99, 2, 2, 2, 2, 2, 2, 2};
	int D3[10] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
	int *D[10] = {D0, D1, D2, D3};
	int pp[4][10] = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
				{10, 11, 12, 13, 14, 15, 16, 17, 18, 19},
				{20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
				{30, 31, 32, 33, 34, 35, 36, 37, 38, 39}
				};
	int hoge[][10] = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
				{10, 11, 12, 13, 14, 15, 16, 17, 18, 19},
				{20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
				{30, 31, 32, 33, 34, 35, 36, 37, 38, 39}
				};
	int **boo;
	int (*pppp)[10];

	printf("1.D[2][2]:[%d]\n", D[2][2] );
	printf("2.D[2][2]:[%d]\n", (*(D+2))[2] );
	printf("3.D[2][2]:[%d]\n", *((*(D+2))+2) );
	printf("4.D[2][2]:[%d]\n", *((D[2])+2) );
	printf("5.pp[2][2]:[%d]\n", pp[2][2] );
	printf("6.pp[2][2]:[%d]\n", (*(pp+2))[2] );
	printf("7.pp[2][2]:[%d]\n", *((*(pp+2))+2) );
	printf("8.pp[2][2]:[%d]\n", *((pp[2])+2) );

	boo = &D[0];
	printf("9.boo[2][2]:[%d]\n", boo[2][2] );
	printf("10.boo[2][2]:[%d]\n", *((*(boo+2))+2) );

	pppp = hoge;
	printf("11.pppp[2][2]:[%d]\n", pppp[2][2] );
	printf("12.pppp[2][2]:[%d]\n", *((*(pppp+2))+2) );

	return 0;
}
```

以下,出力結果
![出力結果20160124.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/43178462-181b-c19f-3fca-64e22d7e126b.jpeg "出力結果20160124.jpg")
一応意図した内容が出力されている.しかし無理矢理出力させているだけなので全然理解できていないorz
世間一般として1.5.9.11.の4種類を2次元配列として出力しているといえるだろう.
しかし,C言語に多次元配列（2次元配列以上の配列）は存在しない.そのため2.3.4.6.7.8.10.12.のような記述方法でも問題なく出力できる.
そして11.12.は配列へのポインタを利用して出力している.理解してコーディングしたつもりだが,やっぱり理解していないorz
う〜ん.C言語は奥が深い.

※余談
　当然ここまで調べたらキャストなどのことも目にする.しかし,ここでは触れないことにしよう（色々今回は消化不良もあり,次に進めないorz）.


以上ですorz

#参考URL
[C言語の宣言、なぜそう書くのか？](http://qiita.com/nwtgck/items/4e5a9e420abc972e8850 "C言語の宣言、なぜそう書くのか？")
[Pointerの超基礎学習#2](http://qiita.com/bukurocci/items/767c368e1eace543e0b6 "Pointerの超基礎学習#2")
[多次元配列の実現](http://www.nurs.or.jp/~sug/soft/tora/tora10.htm "多次元配列の実現")
[文法上多次元配列はない](http://kmaebashi.com/programmer/pointer.html "配列とポインタの完全制覇")
[互換性のないポインタ型からの代入](http://www.c3.club.kyutech.ac.jp/~Krypton/kit_items/cc_error.html "エラーメッセージ")
[１０－４．ポインタのポインタ](http://www9.plala.or.jp/sgwr-t/c/sec10-4.html "「ポインタの配列」と「ポインタのポインタ」")
[Unity] 厳密なタイマーに基づき周期的に処理を実行する


## 概要
周期的に何らかの処理を実行したい場合、Update関数内でTime.deltaTimeから経過時間を取得する方法が一般的です。
しかしUpdate関数の実行は描画タイミングに依存しており、例えば1秒毎に処理を実行したいときに、パフォーマンス次第で周期が1.2秒とか1.5秒になってしまうので必ずしも厳密なタイマーとは言えません。
先日BPMと同期した動きをするシステムを作ろうとしたときにこのことが結構な壁になったので、厳密なタイマーの作り方を記載します。

やりかたとしては２通りあります。

- WaitForSecondsを使ったトリック
- FixedUpdateを使用する


## WaitForSecondsを使ったトリック

周期的に処理を実行する方法としてStartCoroutine()とWaitForSeconds()を組み合わせる方法がありますが、
WaitForSecondsで1[ms]を指定し、コルーチンを1ms周期で呼ぶようにします。これにより、高速な似非無限ループができます。
あとはTime.timeを使って経過時間を監視します。
Time.deltaTimeを使ってはいけません。タイマ計測をフレームレート(Update関数)に依存させないようにするためです。

```csharp

IEnumerator FuncCoroutine() {
	while(true){
		if (Time.time > this.elapsed) {
       		// Do something
       		
       		this.elapsed = Time.time  + timeOut;
   		}

   		yield return new WaitForSeconds((float)1/1000);
   	}
}
```

パフォーマンス次第ではありますが、この方法は"FixedUpdateを使用する"方法より厳密なタイマーがつくれます。



## FixedUpdateを使用する

Updateでやってた時間計測をFixedUpdateでやります。（そのままコードをコピペでOK）
ただしFixedUpdateに処理を詰め込みすぎると衝突判定などに影響がでるので注意。



## 余談
方法としては２通りご紹介しましたが、どちらもストレートな解決策ではありません。。
本当ならUnityのmainループのようなところにタイマーを張れば済むことなんですが、その方法は見つかりませんでした。

またはC#の機能を使って別のスレッドを作り、そっちのスレッドで経過時間を監視する方法もあるようなのですが、とりあえず上記の方法で大体よくなったので試してません。

Fract OSCというUnityエンジンのゲームが完璧にBPMシンクしてる気がするんだけどどうやってるんだろう・・・
【Java】クイックソートのアルゴリズムのテスト

# クイックソート
データの集合を基準値より大きいものと小さいものとのグループに分け、それぞれのグループの中でも新しい基準値を使って同様の作業を行う、という手順を再帰的に繰り返す方式。

##### クイックソート

```QuickSortTest.java
public class QuickSortTest {
    // 配列dのleftからrightまでの間のデータ列をクイックソートする
    static void quick_sort(int[] d, int left, int right) {
        if (left>=right) {
            return;
        }
        int p = d[(left+right)/2];
        int l = left, r = right, tmp;
        while(l<=r) {
            while(d[l] < p) { l++; }
            while(d[r] > p) { r--; }
            if (l<=r) {
                tmp = d[l]; d[l] = d[r]; d[r] = tmp;
                l++; r--;
            }
        }
        quick_sort(d, left, r);  // ピボットより左側をクイックソート
        quick_sort(d, l, right); // ピボットより右側をクイックソート
    }
    // 配列内のデータ列を表示する
    static void print_data(int[] d) {
        for(int i = 0; i < d.length; i++) System.out.print(d[i] + " ");
        System.out.println();
    }
    public static void main(String[] args) {
        int[] data = {5, 10, 3, 7, 8, 1, 9, 2};
        print_data(data);
        quick_sort(data, 0, data.length-1);
        print_data(data);
    }
}

```

# 最後に
ソートの基本的なアルゴリズム（バブルソート、基本挿入法、クイックソート）を学ぶことができたので、他のアルゴリズムなども試してみたい。
jqueryでajax

<DOCTYPE! <!DOCTYPE html>
<html>
<head>
    <title>AJAXテスト</title>
</head>
<body>
    <div>
        <h2>以下のボタンを押すと、AJAXを使用して外部サイトの情報を取得します。</h2>
        <button id="html">プッシュ</button>
        <div id="result"></div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
    <script type="text/javascript">
        (function (){
            $("#html").click(function() {
                $("#result").load("/対象サイト.html", function() {
                    //リスト部分の表示非表示（ボタン入れなければ完全に非表示）
                    //$("<button>項目リスト表示</button>").insertBefore(".line-box-if").attr("id", "listBtn");
                    $(".line-box-if").css("display", "none");
                    $("#listBtn").click(function() {
                        $(".line-box-if").toggle(500);
                    })
                    //h2タイトルより下を隠す
                    $(".section").css("display", "none");
                    //各sectionより前にh2タグでトグル用メニューを挿入
                    var count = 1;
                    var i = 0;
                    var $h2Length = $('#contents h2').length;
                    for(count = 1; count <= $h2Length; count++) {
                        $("#kiyaku" + count).clone().attr("id", "project" + count).insertBefore($(".section:eq("+i+")"));
                        i++;
                    }
                    //トグルを追加
                    var countTog = 1;
                    for(i = 0; i <= $h2Length; i++) {
                        $("#project" + countTog).live("click", (function() {
                            $("h2#kiyaku" + countTog).css("display", "none");
                            $(".section:eq("+i+")").toggle(300);
                            countTog++;
                        }));
                    }
/**
                    $.each(kiyakuCl, function() {
                        this.insertBefore($(".section:eq("+i+")"));
                        i++;
                    })
**/
                });
            })
        })();
    </script>
</body>
</html>
配列・リストの出力方法について

Jakarta Commonsについて確認しているので、
この機会に配列とリストの出力方法について纏めてみる。

取得方法・パターンは下記の通り...

# 取得方法 #

- org.apache.commons.lang3.**ArrayUtils**を使用
- java.util.**Arrays**を使用

# パターン #
- 1次元配列
- 2次元配列
- ArrayListオブジェクト


## ソースコード ##
```java:java
package jp.co.recipe.commons.jakarta.main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;

public class Main01_08 {
	public static void main(String[] args){
		//配列作成
		String[] strArray = {"sunday","manday","tuesday","wednesday","thirthday","friday","saturday"};
		String[][] strDimArray = {
				{"1","2","3","4","5","6","7"},
				{"sunday","manday","tuesday","wednesday","thirthday","friday","saturday"}
		};
		//リスト作成
		List<String> strList = new ArrayList<String>();
		strList.addAll(Arrays.asList(strArray));


		//出力開始＞org.apache.commons.lang3.ArrayUtils
		System.out.println("## 出力開始＞org.apache.commons.lang3.ArrayUtils ##");
		System.out.println(ArrayUtils.toString(strArray));
		System.out.println(ArrayUtils.toString(strList));

		System.out.println(ArrayUtils.toString(strDimArray));


		//出力開始＞java.util
		System.out.println("## 出力開始＞java.util ##");
		System.out.println(Arrays.toString(strArray));
		System.out.println(Arrays.toString(strList.toArray()));

		System.out.println(Arrays.deepToString(strDimArray));
	}
}


```

```:出力結果

## 出力開始＞org.apache.commons.lang3.ArrayUtils ##
{sunday,manday,tuesday,wednesday,thirthday,friday,saturday}
[sunday, manday, tuesday, wednesday, thirthday, friday, saturday]
{{1,2,3,4,5,6,7},{sunday,manday,tuesday,wednesday,thirthday,friday,saturday}}
## 出力開始＞java.util ##
[sunday, manday, tuesday, wednesday, thirthday, friday, saturday]
[sunday, manday, tuesday, wednesday, thirthday, friday, saturday]
[[1, 2, 3, 4, 5, 6, 7], [sunday, manday, tuesday, wednesday, thirthday, friday, saturday]]

```


##所感##
両者に大差はないが、
Java標準ライブラリーのデメリットを上げるとすると、

-toArray()メソッドにて、一旦配列に変換しなければならない。
-多重配列を出力する際、deepToString()という別のメソッドを使用しなければならない。



一方Jakarta CommonsのArrayUtilsクラスであれば、全てにおいてtoString()メソッドで
出力が可能といったところだと感じた。





考察不足かもしれないですが、今回は以上にします。
OS.js - アプリ自作編(公式) -

## オープンソースハックず　-open source Hack's-

![OS.js](https://qiita-image-store.s3.amazonaws.com/0/12007/69ba7e41-2ee4-c86a-dc34-f3bfd53b7283.png)

---

## 事前準備:

OS.js:
http://os.js.org/
Brython:
http://brython.info/
Brython_OSjs: (自作アプリ)
https://github.com/jack-low/Brython_OSjs

---
◆前回からの反省と改善
---
前回からの反省について、いくつかあり、その中でもアプリのインストールと作成については、やっつけ感が半端ない感じでした。
また、日本語化についてもかなり直接のファイル操作となるため、アプリのインストールで、デフォルトに戻るという残念な感じになってます。

そこで、その反省を活かして、今度は正式の手順に沿って、アプリ作成を行いました。

なお、アプリ作成には[チュートリアル](http://os.js.org/doc/tutorials/)があるので、そこから作成方法を学び、nodeの足りないモジュールも追加することで、[前々回強制インストール](http://qiita.com/jack-low@github/items/5d3898564178cbe5d795)という荒技を披露しましたが、こちらも何もなく改善しました。
自分の原因は、[grunt](http://gruntjs.com/)がインストールされていなかったためでした。

---
◆アプリのテンプレート作成
---
それでは、本題に入ります。
まずは、今回の目的は[前回作成したアプリ](http://qiita.com/jack-low@github/items/5d208f717af64375b35c)の公式での作成となります。
そのため、インラインフレーム内への実装となりますので、今回は[IFrame Application](http://os.js.org/doc/tutorials/iframe-application.html)のチュートリアルを参照します。

実行例:

```lang:ターミナル
$ grunt create-package:default/Brython_OSjs:iframe
```

作成後は、各ファイル名はそのままで、ファイル内にあるアプリケーション名等を変更します。
インラインフレームの場合、デフォルトでは、「data/index.html」となってますので、フォルダとファイルを作成します。
作成したら、あとは、各ファイルをアプリ作成に合わせて変更していきます。

インラインフレームの場合は、通常のWebアプリケーションと同様に作成が可能ですので、そのまま作成しても問題ないです。

---

◆インストール方法
---

[インストール方法](http://os.js.org/doc/manuals/man-package-manager.html)は、公式サイトを参照し、実行してください。

```
# src/packagesへ、クローンまたはダウンロード
$ git clone --recursive https://github.com/jack-low/Brython_OSjs.git

# リポジトリリストに追加
grunt config:add-repository:Brython_OSjs

# なお、リストからリポジトリを削除する場合
grunt config:remove-repository:Brython_OSjs

# マニフェストのアップデート
grunt manifest
```

◆パッケージの有効化と無効化

```
# 有効にする
grunt packages:enable:Brython_OSjs

# 無効にする
grunt packages:disable:Brython_OSjs

# マニフェストのアップデート
grunt manifest
```

**※node.js以外にも、[grunt](http://gruntjs.com/)がインストールされていることが条件となります。**

以上、今回は反省点から改善までの流れとなります。