OmniAICreator/Qiita-1.07M huggingface dataset:
AudioStationでAlexa Skillを有効にするときに詰まった話

SynologyのDiskStation、便利に使ってます。Alexaから音楽を流すことができるので、公式サイト通りに有効化しようと思ったのですが、https化に失敗したので、僕の場合の対処法を書いておきます。

## 基本的な操作
[Amazon Alexa で Audio Station skill を有効化する方法](https://originwww.synology.com/ja-jp/knowledgebase/DSM/tutorial/Multimedia/How_to_enable_Audio_Station_skill_on_Amazon_Alexa)通りにやれば基本的にはできるはずです。

DDNSの設定やhttpsの設定を済ませていない場合は、以下の通りに設定すると良いです。
[DDNS でインターネットを介してルーターにアクセス](https://www.synology.com/ja-jp/knowledgebase/SRM/help/SRM/RouterApp/internet_quickconnect)
[Synology NAS で HTTPS を有効にして、認証署名要求を作成するには](https://www.synology.com/ja-jp/knowledgebase/DSM/tutorial/General/How_to_enable_HTTPS_and_create_a_certificate_signing_request_on_your_Synology_NAS)

## httpsの設定で問題が...

httpsの設定を上記の通りきちんとしたつもりなのですが、アクセスできません...
色々試した結果、初歩的なミスで、5001ポート開け忘れていました。

DiskStation上の"ルーターの設定"から、ポート転送規則の追加を行ってください。
[ルーターの設定](https://www.synology.com/ja-jp/knowledgebase/DSM/help/DSM/AdminCenter/connection_routerconf)
最小値を取る関数minをQUBOに変換する

# はじめに

量子アニーリングマシンを利用して最適化を行うには，問題をQUBO (Quadratic Unconstrained Binary Optimization) の形で表現する必要があります．

ここでは,最小値を取る関数minをQUBOに変換してみます．

# 問題設定
バイナリ変数 $x\in \\{0,1\\}^n$ の関数 $f_i(x), i=1,2,...,m$ があるとします．その最小値$F$を最小化したい，としましょう．

```math
\text{minimize}\quad F
```
```math
F=\min_i f_i(x)
```

もちろん， $f_i(x)$ ごとに $m$ 回最適化を行って，一番小さな値を取る $f_i(x)$ を見つければ解は求まります．が，それではつまらないので，ここでは1回の最適化計算で解を求めることを考えます．

# 変換方法
$f_i(x)$ に新たなバイナリ変数 $y_i$ を乗じたものを新たに $F'$ と置き，これを最小化することを考えます．

```math
F'=\sum_{i=1}^m y_if_i(x)
```
ここで，「最小の $f_i(x)$ に対応する $y_i$ だけが1で，残りは0」であれば， $F=F'$ が満たされます．

そこで，$y_i$ には，どれか1つだけが1で，残りが0になるようなペナルティ $P$ を置きます．

```math
P=\left(\sum_{i=1}^m y_i-1\right)^2
```

ここで，$F'$ と $P$ を同時に小さくすることを考えた場合，それを解決するには「最小の $f_i(x)$ に対応する $y_i$ だけが1で，残りは0となる」しかありません．よって，$F'$ と $P$ を（正の係数を用いて）線形結合させてQUBOで表現し，最適化問題を解けば，$f_i(x)$ の最小値を得る $x$ が解として求まるはずです．

なお，$F'$ については，$f_i(x)$ に $y_i$ を乗じていることで次数が上がってしまいます．必要なら次数を下げましょう．次数下げの方法は，[イジング模型への変換 &#8211; 量子コンピューティング情報サイト](https://quantum.fixstars.com/introduction_to_quantum_computer/quantum_annealing/programming/conversion/)に載っています．

# 数値例とpythonコード
```math
\text{minimize}\quad \min\left( f_1(x), f_2(x) \right)
```
```math
f_1(x)=x_1+2x_2
```
```math
f_2(x)=3x_1-x_2
```
を前述の方法に従って変換すると，次のようになります．（当然ながら解は $x_1=0, x_2=1$ で，最小値は $f_2(x)=-1$ です．）

```math
F'=y_1f_1(x)+y_2f_2(x)=x_1y_1+2x_2y_1+3x_1y_2-x_2y_2
```
```math
P=\left(y_1+y_2-1\right)^2=-y_1-y_2+2y_1y_2+1\quad \because y_i^2=y_i 
```

$F'$ と $P$ を足したものを最小化すれば，きっと解が求まるはず．

この問題を，DWave社の[qbsolv](https://github.com/dwavesystems/qbsolv)を使って解いてみましょう． （自分の環境ではDWaveマシンは呼び出せないので，qbsolv内のタブーサーチソルバで解を求めています．）

qbsolvに与えるために，問題を次のように変形します．

```math
\text{minimize}\quad F'+P = x^{\text{T}}Qx + 1, \quad x^{\text{T}} = [x_1, x_2, y_1, y_2]
```

上三角係数行列 $Q$ を，qbsolvに次のように与えます．定数の1は最小化には影響しないのでqbsolvには与えません．

```python
from dwave_qbsolv import QBSolv
Q = {(0, 2): 1, 
    (1, 2): 2,
    (0, 3): 3,
    (1, 3):-1,
    (2, 2):-1,
    (3, 3):-1,
    (2, 3): 2}
response = QBSolv().sample_qubo(Q)
```
計算結果を見てみると，

```python
list(response.samples())
```

[{0: 0, 1: 1, 2: 0, 3: 1}]が得られます．

すなわち $x_1=0$， $x_2=1$， $y_1=0$， $y_2=1$ という解が求まりました．

また，

```python
list(response.data_vectors['energy'])
```
で最小値を見ると，-2.0となっています．Pから出てきた定数の $1$ を足せば $-1$ となり，$F'$ の最小値が得られていることがわかります．

## 環境
Python 3.6.3
dwave-qbsolv 0.2.7

# おわりに
$F'$ と $P$ を線形結合するときのパラメータを調整してもうまくいかない（$P$がゼロにならない）ときは，素直に $m$ 回最適化計算しましょう．
条件式が複数ある三項演算子に混乱した話

# 問題となったコード

突然、下のようなコードが出てきて、なんじゃこりゃってなった話です。

```java
String str = 条件式1 ? 条件式2 ? "A" : "B" : "C";
```

これがどういう動きになるかと、簡単に表にすると、

| 条件式1 | 条件式2 | 出力結果 |
| :----- | :----- | :------ |
| true | true | A |
| true | false | B |
| false | false | C |
| false | true | C |

まとめてみたら分かったのですが、混乱してしまいました。

# 括弧を入れて見やすくしてみた

複数の条件式が記述されている三項演算子は、全く見慣れていないです。
自分にも読みやすいように括弧を入れてみます。

```java
String str = 条件式1 ? (条件式2 ? "A" : "B") : "C";
```

これですこし見やすくなりました。
今度似たようなコードを見たら、（心の中で）括弧をつけろよ！と指摘することにします。

# if~else文に書き換えてみた

結局if~else文に書き換えてみれば、一番わかりやすかったです。

```java
String str = "";
if (条件式1) {
    if (条件式2) {
        str = "A";
    } else {
        str = "B";
    }
} else {
    str = "C";
}
```

if~elseで表現すると、どうしても行数が多くなってしまいます。
なので、三項演算子のほうがスマートに書くことができている気がします。
# 改行を入れて見やすくしてみた

コメントにて教えていただいた方法です。
括弧ではなく、改行を入れてみます。

```java
String str = 条件式1
    ? 条件式2 ? "A" : "B"
    : "C";
```

三項演算子を1行で書いてしまうことが多いですが、条件が複数ある場合に限り、複数行で表現するほうが良いかもしれません。
括弧より見やすくなった気がします。※ あくまで個人的な感覚ですが…

# 条件分岐を書き直してみた

こちらもコメントにて教えていただいた方法です。
条件を見直して見やすくしています。

```java
String str = !条件式1 ? "C" : 条件式2 ? "A" : "B";
```

これをさらに改行すると、

```java
String str = 
        !条件式1 ? "C"
        : 条件式2 ? "A"
        : "B";
```

最初の三項演算子や、if~else文に比べるとかなり見やすくなりました。

# 雑感

最近は、積極的に三項演算子を活用するようにしています。
そこにラムダ式やStream APIを合わせると、かなり行数が少なく表現できるので、かなり気に入っています。

ただ、コードレビューのときに三項演算子ばかり使っていると「可読性が低くない？」って言われてしまいます。
どうしたらいいものやら…となっています。
CodeIgniter2、セキュアクッキーとCSRF の巻

前置き

はい、CodeIgniter2なんて化石です。
バージョンを3に上げれててばいいのも承知の上です。だがそれが簡単に出来ないから苦労してる事もあるわけです。

## 今回の困りごと

クッキーのセキュア属性をOnにした途端、元からフレームワークが提供しているcsrf対策が導入されている箇所が壮大なエラーを披露してくれた。

なんで〜の調査にちょっと時間がかかったので備忘録を残しつつ他の人にも役に立てばと思い、わかった事と最速の対策案をまとめました。

## 調査結果でわかった事

CodeIgniter2では、クッキーのセキュア属性がOnになっている場合は、HTTPS通信であるかどうかを判断して、HTTPSを確認できた時のみCSRFクッキー発行している。

ここまではお利口。

問題は「HTTPS通信であるか」にありました。
ロードバランサやWAFなどを使っている環境では、

```
$_SERVER['HTTPS']
```

だけでは判断が出来ないのに、フレームワークの処理ではこれしか見ていなかった事が今回起きてしまったエラーの原因でした。

## 最速にできる対策

問題を起きした処理は、CodeIgniter3でいい感じに修正されていたので、それを使って問題解消します。
なるべくコアのクラスではなく、拡張クラスで実施おススメします。

## 修正Before/Afterのコード


### Before

```
     if ($secure_cookie)
     {
          $req = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : FALSE;
          if ( ! $req OR $req == 'off')
          {
               return FALSE;
          }
     }
```

そもそも、あんまり綺麗なコードではないですね。

### After

CodeIgniter3の最新安定バージョンから、この処理を引っ越す。
いい感じの使い回しが効くコードで流石に綺麗にもなったなと、成長を少し眺めてしまいました。

```
     /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return	bool
     */
    public function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }
        return FALSE;
    }
```

そして、既存の判定処理の代わりに動くものを以下の通りに修正。ついでに少しだけきれいに（リファクタリングが楽しくて我慢できない人）。

```
     if ($secure_cookie && ! $this->is_https())
     {
          return FALSE;
     }
```

## ちょっとふりかえって

古いフレームワークを使うと色々困る事が多いからこそ、テストコードとかテストそもそもが重要だなと思う日でもあり、最新のコードがGitHubで公開されていて助かるな～と実感する日でもありました。

細かいところ（変数名をキャメルにとか～）も修正したかったけど、リファクタリングし過ぎは事故の元、なので今回は我慢しました。
`UIScrollView` と `UIRefreshControl` を使ってインジケーター表示させるときに・・・

## `UIScrollView` に `UIRefreshControl` を表示させるときの注意点

例えば、初期表示時にインジゲーター表示させて、一旦もろもろのデータを読み込んだタイミングでアニメーションを止めるとする。

この時、インジゲーターの分だけ自動でスクロールされるので `UIScrollView.scrollViewDidScroll(_:)` が一番最初に呼び出される `UIScrollViewDelegate` のメソッドなので気をつけること。

「スクロールが始まる前に変数とか初期化したい！！」と `UIScrollView.scrollViewWillBeginDragging(_:)` で初期化してても動きませんよ。

っていうメモ。


そんなことやってた本人ですヽ(｡・ω・｡)ﾉ
[python] pythonの最大再帰処理回数(Maximum Recursion Depth)を変更する


Pythonが許容する **再帰処理の回数** を超えると
プログラムが下記のようなエラーが出て停止するようになります。

> RecursionError: maximum recursion depth exceeded


そのような時は、コードを先に見なすべきですが、
一時的にその再帰回数をあげる方法もあります。

```py
import sys
 
sys.setrecursionlimit(2000)
```

現在の設定値は、 `sys.getrecursionlimit()` で取得可能です。
デフォルト値は、 **1000** です。
JavaおじさんがPythonを使えるようになるまでの全記録（その4）

#はじめに
1日1回投稿すると言ったな、あれは嘘だ。
いや時間あるんだものｗ

しかしまさかこんなおっさんの備忘録にコメントやいいねが来るとは予想外。
絶対誰も見てないだろうと思ったのにね。

#関数
[テキスト](https://www.amazon.co.jp/gp/product/4764905183/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)の4章のタイトルが「関数、スコープ、抽象化」ということで一応制御構造は一段落なのかな。
たぶんまた小出しにしてくるんだろうけども。

まずは関数。

定義の書式としては型指定が必要ないって点ではJavascriptあたりと似たような感じかな。
一回キーワード引数で呼び出しを記述したらそのあとは最後までキーワード引数でないとダメなのね。
つまり

OK : `printName('Koji', lastName='Nagahara', reverse=True)`
NG : `printName('Koji', lastName='Nagahara', True)`

てことか。
パラメータのデフォルト値の設定はまあJavaにもあるし。

では練習がてらお題を解いてみよう。

> 2つの文字列を引数とし、このどちらか一方の文字列が他方の文字列に含まれる場合Trueを返し、それ以外の場合にFalseを返す関数を書け。inを使ってよし。

関数定義は上に書くのか下に書くのかって議論はありそうよね。
メインの処理の下に書く方が自然かなーとは思うけど、それ以外の構成は割とカオスにならざるを得んかな。
と思って下に書いたらエラーになりやがんの。

```
NameError: name 'isIn' is not defined
```

ですってよ奥さん。要するに前に書いてあるシンボルでないと名称解決ができないということかな。
まあインタープリタ型の言語だしな。
最終的に落ち着いたのはこちら。

```4-1.py
def isIn(t1, t2):
    return t1 in t2 or t2 in t1

print('abcとabを引数に与えたisInの結果：', isIn('abc', 'ab'))
print('abとcaabbを引数に与えたisInの結果：', isIn('ab', 'caabb'))
print('abcとxyzを引数に与えたisInの結果：', isIn('abc', 'xyz'))
```

実行結果はこんな感じ。

```
abcとabを引数に与えたisInの結果： True
abとcaabbを引数に与えたisInの結果： True
abcとxyzを引数に与えたisInの結果： False
```

いたって普通。

#スコープ
まあ[(その1)](https://qiita.com/kjnghr/items/4e4192f69b6393dd97ac)の親切なコメントのおかげでPythonのスコープの種類がいろいろあるのはわかったし、Javaほどネームスペースが細切れになったりしないということもわかった。

テキストにはスタックフレームについて凄い詳細に書いてあるけど、ぶっちゃけ今はそこまではいいや。
しかし関数内で関数定義ができるのか...無名関数とかでなくて普通に関数定義ができるとなるとこれはむしろ教えづらい気がするな...

まあ同一モジュールの中で同名変数はなるべく使わないようにする方が無難ぽいかな。
テキストにも

>気にしなくてよい

って書いてあるしなｗ

#仕様
ふむ、Design by Contractの話ね。終了。
"""から始まるドキュメンテーション文字列ってみんなどのくらい使ってるんだろう。
Javadocの使用率からみて推して知るべしなのかしらね。
しかしここに出てくる抽象化の例は面白いけど抽象化って言っていいのかなｗ

#再帰
再帰もなー。散々他の言語でもやったし「あーやっぱできるんだー」で終了する話ではある。

#広域変数
グローバル変数も使えます、で終了かな。
1970年代に既に批判されていたと...70年代...
日本でグローバル変数あかんて言われ始めたのってもうちょい最近じゃなかったっけｗ
「本当に必要とされる時もある」とだけ書かれてても説得力はないのよなー。
グローバル変数が有用だった事例って思い出せないな...

#モジュール
これはどっちかって言うと構造化言語からオブジェクト指向言語に至る過渡期の機能ってイメージかな。
importでモジュールに対する参照関係を設定するわけだけど、情報隠蔽の概念はなし。
モジュール同士はネームスペースが違うので明示的にどのモジュールで定義されたメンバか指定する必要はある、と。
モジュールとクラスの使い分けを明示的にやってるケースってどのくらいあるのかな。
8章あたりで解説あるみたいだしそれまではおいとこうか。

#ファイルの扱い
openでファイルハンドルを取得して、read/writeで読み書きして最後にファイルハンドルをcloseする、でおしまい。
うん、C言語から変わらない由緒正しいいつもの流れですね。
for ... inで読み込みが簡潔に書けますってのはいいんだけどJavaの例外処理に慣れた身だとコードがシンプルすぎて不安になるな...w

と、ここまでで4章終了。
とりあえずご飯食べたいのでこの記事はここまで。
ScratchのブロックをUnityに対応させてみた

引っ越しましたので[こちら](http://getabakoclub.com/2018/09/25/scratch-%E2%86%92-unity%E5%AF%BE%E5%BF%9C%E6%97%A9%E8%A6%8B%E8%A1%A8/)でご覧ください
「Arrayの中身に対して繰り返し非同期処理を実行する」処理を同期的に実行する時にArray.prototype.map()を使う話


[async関数がPromiseをreturnする](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)事を利用して内部で`await`でpendingさせといてmapの返り値をそのまま`Promise.all()`にブチ込むのよくやる。

```javascript:index.js
(async () => {
  try {
    console.log("begin");
    console.log(Date.now());
    const p = [1, 2, 3].map(async v => {
      await new Promise((s, j) => {
        setTimeout(() => {
          s(true);
        }, 1000 * v);
      });
    });
    console.log(p);
    await Promise.all(p);
    console.log(p);
    console.log("end");
    console.log(Date.now());
  } catch (e) {
    console.error(e);
  }
})();
```

```bash
$ node index.js
begin
1532527193864
[ Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } ]
[ Promise { undefined },
  Promise { undefined },
  Promise { undefined } ]
end
1532527196868
```
多分間違えてるColaboratoryの使い方(Go入門)

# はじめに

goを勉強したいなと思ったのですが、環境構築するのが面倒で（ウソです。本当は全然面倒ではありません）かつ、どこでも使える環境が欲しいと思っていました。

実は、普段から旧cloud9上で jupyter を利用していたりするのですが、たまに落ちたりして困ることがありました。

そこで、Colaboratoryならいつでもどこでも使えるじゃん？と思い立ちやってみました。

## Colaboratoryとは

Googleが作ったjupyterのクローン。googleアカウントさえあれば無料で利用できる。さらにGPUも無料！！

[Google Colaboratory](https://colab.research.google.com/)にブラウザでアクセスするだけです。

jupyterとは
主に機械学習用に利用されている。
セルにPythonのコマンドを入力しながら実行しながらできるので試行錯誤がしやすい。
なれちゃうと、これなしでは生きていけなくなります。

## 環境設定

まずは、Colaboratoryの環境にgoがインストールされているかチェックします。
セルはそのままだとPythonが実行されますが、!を付けるとシェルコマンドが実行されます。
(複数行実行したい場合には、%%bashをつけると便利です。）
これをマジックコマンドといいます。

```:入力セル
!go
```

```:出力セル
/bin/sh: 1: go: not found
```

無常にもインストールされていません。

なら、インストールしてしまいましょう。


```:入力セル
!apt-get install golang
```
（出力は省略）

実行が終わったら、インストールできたか確認しましょう。

```:入力セル
!go version
```

```:出力セル
go version go1.8.3 linux/amd64
```

無事にインストールできました。

## コーディング&実行

早速goのプログラムを書いていきます。

でも、Colaboratory上では、vimとか利用できません。
ここでまたマジックコマンドを利用します。

```:入力セル
%%writefile helloworld.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World\n")
}
``` 

参考 [Go言語のHello Worldを3分で試す](https://qiita.com/techys/items/44a712a76859fe0a9dea)

%%writefile ファイル名
でセルの内容をすべてファイルに書き出すことができます。
ただし、欠点があり、シンタックスハイライトやオートインデントなどが使えません。

その後、以下のセルを実行します。

```:入力セル
!go run helloworld.go
```

```:出力セル
Hello World
```

## 注意

Colaboratoryの仕様でファイルの永続的な保存はできません。（数時間で初期化されます。）
よって

- 毎回goをインストール必要あり
- ソースも毎回作成する必要あり（なので、セルに%%writefileで記述するほうが早いです。）

もちろん、セルの内容はそのままgoogle driveに保存されます。

あと、クラウド環境なので、バージョンなど変わる可能性があります。

## Colaboratoryでやるメリットデメリット

メリット

- いつでもどこでもインターネットに接続できる端末があればできる。
- 自分のPCの性能が悪くても問題なし。PCである必要もない。
- 自端末が故障したりなくしたりしても大丈夫。
- コマンド実行ログなども残る。
- テキストセルがあるため、そちらにマークダウンでコメントを残せる。

デメリット

- インターネットがないと使えない。
- googleさんがやめたら使えない。
- シンタックスハイライトや保管など高機能なエディタ機能が利用できない。
- 対話型のシェルコマンドが利用できない。← これが何気に一番痛いです。

## おわりに

今回はgoにしましたが、同じ方法で他の言語も利用できます。
Colaboratory便利なのでどんどん使いましょう！！
テスト課金処理中に「DF-BA-AH-01」というエラーが出た時に…

Androidのテスト課金の処理中に ***DF-BA-AH-01*** というエラーコードが出てきて、解消するのに一苦労したのでメモがてら投稿します。

# 現象
テスト課金の処理で、アイテムの購入のフローを進んでいくと

> サーバーからの情報の取得中にエラーが発生しました。[DF-BA-AH-01]

というエラーが出てきてアイテムの購入が出来ない状態になりました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/995/285439af-f8dc-b5e5-f4c7-3a6058dccdce.png" width="320" />

（消費アイテム・定期購読でも同じエラーが出てきました。）
※テストするアカウントを別のテストアカウントにすると正常にテスト購入が出来ました。

# 試行錯誤
ググってもこれといった解決方法が見つからず、
https://support.google.com/googleplay/answer/7513003?hl=ja
を参考に、

・Google Playストアのデータ削除
・端末の再起動
・アプリの再インストール
・テスト用のGoogleアカウントを端末から削除して、再度ログイン

などをしました。

しかし結局どれを試してもエラーが消えることはなく…

# 最終的に…
Google Play Console の ***テスト用のアクセス権がある Gmail アカウント*** 欄で、エラーが起こるテストアカウントのメールアドレスを削除してから、再度入力したらエラーが出ることがなくなり、課金処理が出来るようになりました。（謎）
<img width="759" alt="スクリーンショット_2018-07-26_19_41_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/995/0d2043fb-f36a-cd9f-7582-00804ad11b6f.png">

# まとめ
謎のエラーでしたが、最終的にはGoogle Play Consoleのテストアカウトの欄から該当するメールアドレスを削除→再入力という謎の方法で解決することが出来ました。（もしかしたら DF-BA-AH-01 エラーは、テスト登録に失敗しているよ、というエラーなのか？）

今回の方法で必ず直るという確証はありませんが、同じエラーでお困りの際は試してみてください。
AE ExtendScript n文字毎に改行する

#正規表現を使って文字列を指定したn文字毎に改行（\n）する

AEテキストレイヤーを作成する時に一行の文字数を制限させたかった。

```jsx
var n=17, str="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
var r=new RegExp(".{1,"+n+"}","g")
var result = str.match(r).toString().replace(/,/g,'\r');
$.writeln(result)
```

結果

```jsx
abcdefghijklmnopq
rstuvwxyzabcdefgh
ijklmnopqrstuvwxy
zabcdefghijklmnop
qrstuvwxyzabcdefg
hijklmnopqrstuvwx
yz
```
GRUB から Windows を起動してみる⁽⁽٩( ˘ω˘)۶⁾⁾

#はじめに
**個人用メモ**です. あくまで私の環境で動作しただけなので, 

「パソコンこわれた(´・ω・`)」

と言われても責任は取れません. あしからず.
~~まぁそこまで深刻な事態にはならないと思いますが~~

# 動機
デュアルブートをしている PC でついてくる問題として, 電源ボタンを押した時に どの OS を起動させようかな, というのがあります. 例えば標準を Linux にして Windows を起動するときだけ Boot メニューから, というのは, 特定のキー(私の場合はF9)を連打したりしないといけないのでちょっと面倒です. そこで, Linux を起動する時に用いる GRUB のメニューから Windows を起動できないかな〜って思ったわけです(本当は違う理由があったりなかったり）.

# 環境
- GRUB2
- UEFI環境
- Windows10, ArchLinux(Ubuntu とかでも大丈夫だと思います)

特に UEFI 未対応の方には, あまりためにならないかも

# どうやんの?
以下のファイルを, `/etc/grub.d/42_windows` として保存します.
ディスク名, パーティション名については人それぞれだと思うので, ご自身で調べてください.
(GRUB の shell にて, `ls -l` で確認できます.)

```sh:42_windows
#!/bin/sh 
exec tail -n +3 $0 
menuentry 'Windows' { 
   insmod ntfs 
   set root=(hd1,gpt1) # ここに Windows のディスク名, boot パーティション名 を入れる 
   chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}
```

続いて, このファイルのパーミッションを `-rwxr-xr-x` に変更してください(少なくとも実行できれば大丈夫だと思います).

```sh
$ sudo chmod 755 /etc/grub.d/42_windows
```

続いて, /boot/grub/grub.cfg のバックアップをとりましょう.

```sh
$ sudo cp /boot/grub/grub.cfg /file/to/backup/grub.cfg.bak
```

そして, grub-mkconfig[^1] コマンドで /boot/grub/grub.cfg に上書き保存をします.

```sh
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
```
[^1]: grub2-mkconfig の方もいらっしゃるかもしれませんが, 大丈夫だと思います.

最後に reboot し, 再び GRUB のメニューに入ると **Windows** の文字が見えると思うので, それを選択すると Windows が起動するはずです. 

起動した方, お疲れ様でした.
起動しなかった方, ごめんなさい:;(∩´﹏`∩);:

# 参考文献
[24.5. GRUB 2 設定ファイルのカスタマイズ - Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-customizing_the_grub_2_configuration_file)
[How can I manually boot Windows from the Grub2 terminal? - Ask Ubuntu](https://askubuntu.com/questions/833006/how-can-i-manually-boot-windows-from-the-grub2-terminal)
コミットメッセージでgit logを検索する

#コミットメッセージでgit logを検索する

```

$ git log --grep=検索文字列
```

#コミットしたユーザーで検索する

```
$ git log --author=検索文字列
```

よく使うのでついでに。authorじゃなくてcommitterでもいいみたい。

#記事の経緯
タイトルのような感じで検索すると

```
$ git log --grep 検索文字列
```

というのが結構出てくるが、実行したらエラーになったので調べた。
複数件出てきたので自分の環境？と思ったけど、Gitのドキュメントにも↑のように書いてあった。
[Git - git-log Documentation](https://git-scm.com/docs/git-log)
バージョンの差異とかでしょうか。
ネットワークに関して(随時更新していきます)

# そもそもネットワークとは
「 <font color="Red">何か</font> が <font color="Red">網状に繋がって</font> いて、何かを <font color="Red">運ぶ</font> 」
そのようなもののことを言う。
例えば、コンピュータ・ネットワークは、コンピュータがケーブルで繋がっており、情報を運んでいる。

# ネットワークの歩み
[<font color="Red">スニーカーネット</font>](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%8B%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88) から [<font color="Red">LAN</font>](https://ja.wikipedia.org/wiki/Local_Area_Network) へ、そして [<font color="Red">WAN</font>](https://ja.wikipedia.org/wiki/Wide_Area_Network) へ。

# ランとワン
<font color="Red">LAN</font> … 速い(10Mbps)、低ノイズ。LANケーブルで繋ぐ。
<font color="Red">WAN</font> … 遅い([ISDN](https://ja.wikipedia.org/wiki/ISDN)は通常最大128Kbps / [ADSL](https://ja.wikipedia.org/wiki/ADSL)は8Mbps / 光ファイバを使うBフレッツは例外的に高速)。電話回線を借りて使う。

# プロトコル(約束ごと)


# 参考
3分間NetWorking
http://www5e.biglobe.ne.jp/%257eaji/3min/01.html
WshShellでexeをパス指定して実行するときのRun / Execの違い

Runはパスをバックスラッシュで区切らないといけない。
JScriptだとエスケープしながらなので、`fooFoler\\bar.exe`みたいな形になる。
スラッシュ区切りのパスを与えると「指定されたファイルが見つかりません。」となる。

しかし、
**Execはスラッシュ区切りでも実行してくれる。**
Railsのrakeってなんぞ？

# 概要

TechTrainでメンターをやってる大木です。

そもそもRailsをいじったことがないに等しい状態(過去に少しだけ触った)であったので、改めていじってみてわからなかったところをまとめてみました。
この記事はrakeについてまとめます。

すでにこの記事の初期稿を書いた時点で、**rakeは非推奨**です。

もしどこか**他の記事を読んでこの記事にたどり着いている人はそもそも調べている記事が古い**ので、
**検索する際も最近1年の記事を見るなど工夫した方が良さそう**です。
Rails5以降を使っている人は使わないようにしてください。

**なぜ最近1年が良いのかわからないという人は、最後の見出しの項目がわかっていないかもしれません。**
**最後の見出しの項目を読んでみて下さい。**

# rake とは？

公式ドキュメント様より

> Rakeとは Rubyで記述されたビルドツールです。

そうかそうか・・・。
これだけではわからない部分も多いと思うのでもう少し深掘ります。

# 何に使われている？

* 設定ファイルに記述されている作業を上から順に実行してくれます。これを使って様々な処理を実行したりしていました。

## Rakeの特徴

1. Rubyで記述ができる
2. 言語内DSLを採用
3. Rakefileというファイルに一連の処理を定義する （この処理のまとまりを「タスク」と呼ぶ）

### DSL(Domain-Specific Language)とは？
 → 特定の領域で特化して設計された言語
(例)Rake, RSpec, SQLなど。

## だがしかし統一

Rails5からrakeタスクがrailsコマンドに統一されました。
ということで、railsコマンド一本でどうにかできます。

Rails5についてはAPIモードでプロジェクトを始められることくらいしか知らないというかたも多いかなと思いますので、Rail5の公式のリリースノートを読んでみましょう。

# [Ruby on Rails 5.0 リリースノート](https://railsguides.jp/5_0_release_notes.html) を読む

わからないことはまず公式ドキュメントが一番ですよね。

## Rails 5.0の注目ポイント

- Action Cable
- Rails API
- Active Record属性API
- テストランナー
- Rakeコマンドをrailsコマンドに統一
- Sprockets 3
- Turbolinks 5
- Ruby 2.2.2以上が必須

以上のあたりが主な変更点です。
この辺りの詳しいことはまた別の機会でも(あれば)書きます。

## 余談：Rails4までの記事を見てるかも

古いRailsの記事でbatchを作成する記事+タスク+Rakeというワードが存在するのであれば、Rakeを使うものなので、Rails5からはちょっと違うやり方になります。別の記事を探しましょう。

## そもそもバージョンによって色々変わるの！？ってびっくりしている方へ。

変わります。
iPhoneで使っているアプリのバージョンと同じように機能がいきなり現れたり、機能が無くなったりするのと同じです。
自分が使っているものについては、公式が出している説明書(公式ドキュメント)を読みに行くのがお勧めします。
個人のブログ記事は、あくまで参考程度に使うようにしましょう。
こわくない xargs ( 初心者のためのシェル入門 )


## 基本

標準出力を受け取って他のコマンドに渡すことが出来る。

```bash
echo Bob Carol | xargs echo

Bob Carol
```


## 「置換文字」を指定する

`--replace` または `-I` オプションを付けると「置換用の文字」を指定できる。

たとえば次の例だと `SomeString` は `Bob Carol` に置換される。

```bash
echo Bob Carol | xargs --replace=SomeString echo Alice SomeString David

Alice Bob Carol David
```

## `file` コマンドと組み合わせる

よく使う例。

### ファイルの準備

```
echo "Alice" > ./alice.txt
echo "Bob" > ./bob.txt
echo "Carol" > ./carol.txt
```

### 普通に `find` するとこんな感じ

```
find ./ -type f

./carol.txt
./bob.txt
./alice.txt
```

### `xargs` と組み合わせて利用

`SomeFile` がファイル名に置換されて、全てのファイルを `cat` で読むことが出来る。


```
find ./ -type f | xargs --replace=SomeFile cat SomeFile

Carol
Bob
Alice
```

ちなみにこの場合、`find` の結果は3行あるため、3回の評価がおこなわれる。


## 複数のコマンドを `xargs` と組み合わせる場合

bash / sh コマンドを利用して、その中に置換文字を埋め込んでやれば良い。

### `cat` して `echo` の両方を使う例

```
find ./ -type f | xargs --replace=SomeFile bash -c "cat SomeFile && echo SomeFile"

Carol
./carol.txt
Bob
./bob.txt
Alice
./alice.txt
```

### 「コマンドの中にコマンド」ではうまくいかない

メインコマンドよりも「コマンドの中のコマンド」 `$()` の方が先に走ってしまい、必然的に文字置換の処理も起こらない。

```
find ./ -type f | xargs --replace=SomeFile $(cat SomeFile && echo SomeFile)

cat: SomeFile: No such file or directory
```

# 環境

- GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)

# Gist

- [Very Beginner of xargs | Linux shell command](https://gist.github.com/YumaInaura/baa8c7ce79f2811a43b23c82e579a6df/)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vue.use( )を書く場合と書かない場合

## 　Vue.use( )って何よ :thinking: ？
- Vue.jsのライブラリを使用する関数という理解 ( 個人的 )

※ 公式ドキュメント
https://jp.vuejs.org/v2/guide/plugins.html

## Vue.useを書く場合
```js
import Vue from 'vue/dist/vue.esm.js'
import VueRouter from 'vue-router'
import Index from '../components/index.vue'
import About from '../components/about.vue'
import Contact from '../components/contact.vue'

Vue.use(VueRouter)

export default new VueRouter({
  mode: 'history',
  routes: [
      { path: '/', component: Index },
      { path: '/about', component: About },
      { path: '/contact', component: Contact },
  ],
})
```

- 上記のように `Vue.jsのライブラリを使う場合` (VueRouter,Vuelidateなどなど)はVue.use(ライブラリ名)で使用するライブラリを読み込む

## Vue.useを書かない場合
```js
import axios from 'axios';
  export default {
    data: function () {
      return {
        tasks: [],
        newTask: ''
      }
    },
    mounted: function () {
      this.fetchTasks();
    },
    methods: {
      fetchTasks: function () {
        axios.get('/api/tasks').then((response) => {
          for (let i = 0; i < response.data.tasks.length; i++) {
            this.tasks.push(response.data.tasks[i])
          }
        }, (error) => {
          console.log(error);
        });
      },
 <中略>
```

- npmなどでインストールするVue.jsのライブラリとは異なる外部ライブラリは、 `Vue.use` で記載しない  
(ここの場合は `axios` をimportしているが、Vue.js用に作られたライブラリではないので、 `Vue.use` を使わない)

## 最後に
- 理解不足で誤った記載があるかもしれません。もし誤りがありましたら、ご指摘頂ければ幸いです :pray:

## 2018年7月27日追記
コメント頂いた部分を修正しました。
修正前は、Vue.use( )を使う場合はVue.js公式ライブラリだと記載していましたが、
単にVue.js用に作られたライブラリを使う場合にVue.use( )を使うということで記載修正しています。
Pythonで2の補数を10進数に変換する

Pythonでbit数に関係なく2の補数を10進数に変換する関数を作成してみました。

# 環境
Python 3.6

## 2の補数を10進数に変換

*[shiracamus様](https://qiita.com/shiracamus)にコメント頂いた方を採用させていただきました*

```python

def convert_complement_on_two_into_decimal(bits):
    return -int(bits[0]) << len(bits) | int(bits, 2)
```

廃止
def convert_complement_on_two_into_decimal(bit_data):
    ~~return -(int(bit_data, 2) & int(format(2**(len(bit_data)-1), "b"),2)) | (int(bit_data, 2) & int(format(2**(len(bit_data)-1)-1, "0%db" %len(bit_data)), 2))~~



### 検証

2の補数で、それぞれのbit数で表現可能な整数の範囲は、*-(2^(n-1))～2^(n-1)-1*となります（※nはビット数）。

```python:6bitの場合
>>> convert_complement_on_two_into_decimal("100000")
-32
>>> convert_complement_on_two_into_decimal("100001")
-31
>>> convert_complement_on_two_into_decimal("111111")
-1
>>> convert_complement_on_two_into_decimal("000000")
0
>>> convert_complement_on_two_into_decimal("011110")
30
>>> convert_complement_on_two_into_decimal("011111")
31
```

```python:5bitの場合
>>> convert_complement_on_two_into_decimal("10000")
-16
>>> convert_complement_on_two_into_decimal("01111")
15
```

# 参考

[コンピュータにおける「データ表現」の基礎（第2回）]
(https://tech.nikkeibp.co.jp/it/members/ITPro/ITBASIC/20010719/2/)
[2の補数を理解する (1)]
(http://d.hatena.ne.jp/simply-k/20100824/1282743815)

[shiracamus様](https://qiita.com/shiracamus)にコメント頂く前は、2の補数から10進数への変換ロジックは以下を参考にさせていただきました。
ありがとうございました。
[Pythonで符号付き8bit整数を扱う(2の補数)]
(http://eng-memo.hatenadiary.com/entry/2016/04/14/211401)
Unity Distributionでもログを確認する


１、XcodeとiPhoneをつなぐ

２、Xcodeの「Window」→「Devices and Simulators」 をクリック

３、「Open Console」　をクリック

４、左のバーのiPhoneをクリック

**ログが表示されるので、Debug.Logで出力したものを確かめる。**

たまにログが更新されないので、iPhoneを抜き差しする。
sequelize-cliでdb:migrateできなくてつらかった

新しくパソコンを買ってもらったので、環境作りしていたら、postgresql が動かないので大変こまった。

```
$ brew install postgresql
==> Downloading https://homebrew.bintray.com/bottles/postgresql-10.4.high_sierra.bottle.tar.gz
Already downloaded: /Users/ninjaninja/Library/Caches/Homebrew/postgresql-10.4.high_sierra.bottle.tar.gz
==> Pouring postgresql-10.4.high_sierra.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink include/pg_config.h
Target /usr/local/include/pg_config.h
already exists. You may want to remove it:
  rm '/usr/local/include/pg_config.h'

To force the link and overwrite all conflicting files:
  brew link --overwrite postgresql

To list all files that would be deleted:
  brew link --overwrite --dry-run postgresql

Possible conflicting files are:
/usr/local/include/pg_config.h
/usr/local/include/pg_config_manual.h
/usr/local/include/pg_config_os.h
```

おまえかーーー!!!

```
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
```

とりあえず権限を変更すれば良いらしいので、chown

```
$ sudo chown $(whoami) /usr/local
Password:
chown: /usr/local: Operation not permitted
```

sudoで変更できないんだ。どうしよう。

世界のおともだちによれば、
https://github.com/Homebrew/brew/issues/3228

```
sudo chown -R $(whoami) $(brew --prefix)/*
```

/usr/localは諦めて、以下全部自分のにすればよくない?とのこと。いけたわ!

で、ようやくmigrate

```
$ sequelize db:migrate

Sequelize CLI [Node: 10.5.0, CLI: 4.0.0, ORM: 4.38.0]

Loaded configuration file "config/config.json".
Using environment "development".

ERROR: Please install 'pg' module manually
```

pg 入ってますがな!!

世界のおともだちによれば、
https://github.com/sequelize/sequelize/issues/6907
「-g で入れたら動いたで」とのことなので試す。

```
$ npm install -g sequelize sequelize-cli pg --save
/usr/local/bin/sequelize -> /usr/local/lib/node_modules/sequelize-cli/lib/sequelize
+ sequelize-cli@4.0.0
+ sequelize@4.38.0
+ pg@7.4.3
added 15 packages from 9 contributors and updated 2 packages in 2.538s
```

動きました。ありがとうございました。
Microsoft FlowのDo Until途中で終わってしまう悪夢を経験したお話

# 今回の投稿背景
進行中のワークフローがありまして
ちょっと2時間以上放置してまして
そのあと承認したとおもったら・・・
まだ次の承認があるはずなのに、すべてが終わるという
とんでもないバグが見つかったんですよぉ～

# なぁにぃ～？やっちまったなぁ！！
男は黙って
**「IF分岐！」**
・・・すみません(*ﾉωﾉ)

# 原因
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/eca2e9cc-ba94-fb39-9d2c-172eff9dee95.png)
このタイムアウトが原因です。
デフォルトがPT1H（1時間）となっています。
Logic Appのマニュアルサイトを見ると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/510ff0a1-08ef-f802-4b24-46878e793df0.png)

[参考サイト：Azure Logic Apps 内のワークフロー アクションを繰り返す、または配列を処理するループを作成する](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-control-flow-loops#prevent-endless-loops)


となっており、この条件分岐に入って1時間経過したら
「フローは止めないけど、ループは終わるよ！」という仕様のようです。

# さてどうする？
それなりに時間を確保しておきたいので、ざっと1年としとけば大丈夫でしょ！という安易な考えで
Wikipediaさんを参考に
https://ja.wikipedia.org/wiki/ISO_8601

```php:DoUntil_TimeOut
PY1
```
って宣言したんですよ。
・・・まぁ怒られましたけどねOrz
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/233b166f-0ad6-8e3f-86b1-2fce208cf1c5.png)

# 実は制限事項があるのです
[参考サイト：Microsoft Flow での制限事項と構成](https://docs.microsoft.com/ja-jp/flow/limits-and-config)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/3caa8e19-2f57-ea45-6869-695a1264fde1.png)

要は、30日以上は承認自体がタイムアウトしまっせ！ということです。
なので、30日以上に設定するのはNGという形ですね。

# というわけで・・・
こうしたわけですよ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/16495c9c-bf98-67e7-68fc-33390eef3486.png)
タイムアウト時間を720時間（30日）に設定しました。

# 結果は・・・
問題なし！

# まとめ
・ クラウドのリソースを使う仕様なので、条件分岐には結構制約事項がある
・ 今回の制約事項は一般ユーザに使ってもらってて判明した内容
・ やはりこういう簡単にいろいろできちゃうものでもテストは**超重要**
MATLABで複数バイト文字をchar型に分解，再構成


シリアル通信とかでデータを投げたいときにfloatを1バイト文字に分解して送るのはよくあるかと思います。

matlabではtypecastという関数がこれに対応しています。
例えば3.34という少数を4バイトの文字列として送る際には，

```
>> typecast(single(3.34),'uint8')

ans =

  143  194   85   64
```

とこのようにこれらの4文字を送ればいいわけです。

なお，maltabはなるべくでかい型ですべての文字を保存しようとするのでsingle型に最初にキャストする必要があることには注意してください。

以下はだめな例です。

```
>> typecast([143  194   85   64],'single')

ans =

         0    3.5293         0    3.6289         0    3.3320         0    3.2500
```

きちんと**uint8**にキャストしてから関数にぶち込みましょう。

```
>> typecast(uint8([143  194   85   64]),'single')

ans =

    3.3400
```


なお，これをdSPACEのRTIシステムにぶん投げたところ，RTIシステムではtypecastが使えないとのことでエラーになりました。憤死。

**Cで書くのが正着かもしれない**
個人学習メモ＃９　PHP

スーパーグローバル変数

$GLOBALS　グローバル変数

システムによって値が格納される

$_SERVER　サーバー変数

$_ENV　環境変数

$_COOKIE　HTTPクッキー

送信フォームからの値を受け取る

$_GET　HTTP GET変数

$_POST　HTTP POST変数

アップロードされたファイルや名称が格納される

$_FILES　HTTPファイルアップロード変数

$_REQUEST　リクエスト変数

データを持ち回るための変数

$_SESSION　セッション変数


formタグ
入力、送信フォームを表示させたい時に使う

actionタグ
formタグに必ず指定しなければならない
formの送信ボタンを押して送信されるデータの送信先を指定する
データの送信先のことをURLという
指定するのはデータを受け渡す処理をしてくれるサーバーのCGIプログラムのURI

CGIプログラム
Common Gateway Interface（コモンゲートウェイインターフェイス）の略
CGIとはWebサーバーかプログラムを実行するときのルールのこと
CGIの仕組みによって起動されるプログラムのことを主にCGIプログラムという
メールフォームの場合は、メールフォームに入力されて送信されたデータを受け取ってあとの応答をCGIプログラムで処理される

CGIプログラムはRuby,Java,C#など様々なものを使用して記述できる。


method
formタグに指定する属性で、必須ではない
送信するときの転送方法を指定する
post,getがある

method - get
入力したフォーム内容のデータがURIにくっついて送信される

method - post
入力したフォーム内容はURIとは別の場所に保管されてデータが送信される
データは外側からの表示では見ることができないので安全性が高い

get - post違い
get
データ量の制限がある
送信したデータ内容が送信先のサーバーにログとして残ってしまうことがある。
サーバー側にあるデータの取得に適している

post
データ量の制限がない
ユーザー側が情報を送信するのに適している

URI
-URL
—URN
Execution failed for task ':app:processReleaseResources'の解決方法【React Native, Android】

React Nativeのプロジェクトをリリースビルドした時に発生しました(Androidのみ)

`res`周りのエラーでした。

私の場合は、`res`フォルダ内にパスの長いファイルが存在していたことが原因だったので、該当のパス名を含む名前の長いファイルを削除で解決。

他の人で同様のエラーが起きた時に解決法として紹介されていたものを以下にまとめます。

- 「Build > Clean Project」→ 「Build > Rebuild Project」
-  `build.gradle`の`applicationId`と`AndroidManifest.xml`の`package`を合わせる
-  sdk versionを統一する
5分でできるMacBook Proに最低限の開発環境構築

これは[cloudpack あら便利カレンダー 2018](https://benri2018.rnd.cloudpack.jp/)の記事です。

## 概要

もし新しい職場に入り、MacBook Proを手渡され、「開発できるように5分で支度しな！」と言われた際にご参考ください。

※ 実際にはしっかりと準備する期間をもらってます。

関わる案件が決まったらそれに必要な言語などを入れましょう。


## 手順

### システム設定

- ネットワーク
    - それぞれの環境に合わせて設定。
- トラックパッドでタップ
    - https://www.outoutput.com/mac-trackpad-tap-click-drag/
- 3本指ドラッグ: トラックパッドを使うなら。
    - https://support.apple.com/ja-jp/HT204609
- Command、Ctrl入れ替え: 趣味でどうぞ。
    - http://d.hatena.ne.jp/yamamo_men/20120210/1328887773


### インストール

ターミナルを立ち上げて。

```sh

# とりあえずもうおまじない的に。

> sudo xcode-select --install

# HomeBrew: これがないと始まらない
# https://brew.sh/index_ja

> /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# HomeBrew Cask: GUIアプリのインストールに必要

> brew install cask

# Hyper: iTermでも可
# https://hyper.is/

> brew cask install hyper
```

ターミナルを投げ捨て、
おもむろにHyperを立ち上げて。

```sh

# Hyper pluginで透明化: なくてもいい。趣味
# https://www.npmjs.com/package/hyper-transparent

> hyper i hyper-transparent

# fish: お好みのシェルで可。趣味
# https://qiita.com/Ted-HM/items/10b452e434b24d938877
# https://nonsensej.xyz/?p=741
# https://qiita.com/k-waragai/items/396acd783ed03511d57c

> brew install fish

# Alfred: コマンドランチャー
# https://www.alfredapp.com/
# http://www.specdesign.com.au/blog/tips/alfred/

> brew cask install alfred

# Google Chrome: ブラウザもお好みで。

> brew cask install google-chrome

# Google日本語入力

> brew cask install google-japanese-ime

# slack: 必要であれば。

> brew cask install slack

# エディタ関連

# vscode
# https://code.visualstudio.com/

> brew cask install visual-studio-code

# Sublime Text
# https://www.sublimetext.com/3
# https://www.sejuku.net/blog/5099

> brew tap caskroom/homebrew-versions
> brew cask install sublime-text

# franz: デスクトップをスッキリできるすぐれもの
# https://meetfranz.com/
# https://manablog.org/franz/

> brew cask install franz

# git設定: ついつい忘れがち

> git config --global user.name "ユーザ名"
> git config --global user.mail "メールアドレス"

# go: ghqいれるのに必要(のはず)

> brew install go

# ghq: リポジトリ管理ツール
# https://github.com/motemen/ghq
# https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2

> brew tap motemen/ghq
> brew install ghq

# ルートパスの設定
> git config --global ghq.root [好きなパス]

```
カフェインと昼寝の力で午後の睡魔を寄せ付けない

# 食後眠くなる問題
業務が始まった当初、業務中どうしても眠くなる問題にぶつかった。
特に食後の睡魔に対してはどうしても抗うことができず、作業時間・作業効率が損なわれるという事態が発生した。
この睡魔をなんとか払拭できないかと思い、カフェインと昼寝を利用した施策を試したところ効果があったので紹介したい。

### 1.戦略的睡眠
睡魔と戦うことが無駄な抵抗であることは経験上薄々気づいているので、立ち向かわず素直に睡眠をとることにした。
実は適度な昼寝はメリットが多いらしく[昼寝をすることで午後の作業効率がアップする](https://diamond.jp/articles/-/112221)ことはNASAの実験結果として発表されているぐらいである。

海外ではpower upとnapをかけて「power nap」と呼ばれるらしく、制度として導入している企業も存在している。
ただし昼寝の時間が長すぎると逆効果になってしまうらしいので、気をつけよう。15分前後が良いらしい。

昼寝の詳しい効用については[こちら](https://fuminners.jp/nemui/7406/)が詳しい。

### 2.カフェインの力を借りる
主にコーヒーに含まれるカフェインには、覚醒効果があることはよく知られている。
コーヒーを飲んでからカフェインが効き始めるまでは約20分ほどの**タイムラグ**があるらしい。
このタイムラグを利用する。

# こうなる
### 昼食　→　カフェインの摂取　→　昼寝 15min.→　覚醒!!
-------------------------20min.-------------------------------->覚醒!!

このように昼寝前にカフェインを摂取することで、目覚めのタイミングとカフェインが効き始めるタイミングを一致させることができる。
昼寝の回復効果とカフェインの覚醒作用により、よりスッキリ起きることができる。

### 結果
この方法を取り入れてから、午後に眠くなることが減った。ぜひ試していただきたい。
Oracle Database 18cの簡易セットアップ

Oracle Database 18cがリリースされました。

[Oracle Database Software Downloads | Oracle Technology Network | Oracle](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)

手元のPC上のVirtualBoxでサクッとセットアップする手順を自動化したので公開します。

* [shakiyam/vagrant-oracle18: Vagrant + Oracle Linux 7 + Oracle Database 18c (18.3.0) シングル環境の簡易セットアップ](https://github.com/shakiyam/vagrant-oracle18)

![qiita vagrant-oracle18.png](https://qiita-image-store.s3.amazonaws.com/0/174/91288438-cc80-759c-cd49-a630fa13e040.png)

それ以外のバージョンの手順も下記にて公開しています。

* [shakiyam/vagrant-oracle12.2: Vagrant + Oracle Linux 7 + Oracle Database 12c Release 2 (12.2.0.1) シングル環境の簡易セットアップ](https://github.com/shakiyam/vagrant-oracle12.2)
* [shakiyam/vagrant-oracle12.1: Vagrant + Oracle Linux 7 + Oracle Database 12c Release 1 (12.1.0.2) Enterprise Editionシングル環境の簡易セットアップ](https://github.com/shakiyam/vagrant-oracle12.1)
* [shakiyam/vagrant-oracle11.2: Vagrant + Oracle Linux 7.4 + Oracle Database 11g Release 2 (11.2.0.1) Enterprise Editionシングル環境の簡易セットアップ](https://github.com/shakiyam/vagrant-oracle11.2)
【Dartメモ】Dartの名前付き引数 (Named Parameter)

Dartでは名前付き引数(Named Parameter)の利用が可能です． 名前付き引数を利用することで，引数の指定誤りを防ぐことができます．

### **名前付き引数を使わない場合**

下記では`Person`クラスを作成し，コンストラクタに名字(`last`)と名前(`first`)を引数として渡している． 
名前付き引数を利用しない場合，1番目が名字なのか，2番目が名字なのかわからず後々エラーの原因になる可能性がある．

```dart
void main() {
  var person1 = new Person('Jordan','Micheal');
  
  print(person1);
}

class Person {
  String last;
  String first;
  
  Person(this.last, this.first);

  toString() {
    return '$last, $first';
  }
}
```

### **名前付き引数を使う場合**
下記の通り名前付き引数を利用することで，コンストラクタで定義されている引数の順番と異なっていても，正しく初期化ができる．

```dart
void main() {
  var person1 = new Person(first:'Micheal',last:'Jordan');
  
  print(person1);
}

class Person {
  String last;
  String first;
  
  Person({this.last, this.first});

  toString() {
    return '$last, $first';
  }
}
```

### **引数を必須にする**

上記は引数を省略可能であったため，`meta.dart`をimportし，`@required`のアノテーションを引数に付与することで，必須パラメターとなる．

```dart
import 'package:meta/meta.dart';

void main() {
  var person1 = new Person(first:'Micheal',last:'Jordan');

  print(person1);
}

class Person {
  String last;
  String first;

  Person({@required this.last, @required this.first});

  toString() {
    return '$last, $first';
  }
}
```
CoreOSをインストールしてみた。

##はじめに
CoreOSをインストールしてみました。
その時の備忘録です。

##インストール手順
<b>1.以下のサイトより、CoreOSのISOファイルを入手する。
https://coreos.com/os/docs/latest/booting-with-iso.html

<b>2.入手したISOでブートします。</b>
自動でcoreユーザでログインされます。

<b>3.opensslのコマンドで暗号化したパスワードを作成します。</b>
$ sudo openssl passwd -1

<b>4.cloud-config.ymlファイルを作成し、インストールに必要な情報を記載する。</b>

```<b>cloud-config.yml</b>
#cloud-config

# ホスト名
hostname: CoreOS

coreos:
  units:
    # 静的ネットワーク設定
    - name: static.network
      runtime: no
      content: |
        [Match]
        Name=ens192 # インタフェース名
        [Network]
        Address=xxx.xxx.xxx.xxx/xx # IPアドレス/サブネットマスク
        Gateway=xxx.xxx.xxx.xxx # デフォルトゲートウェイ
        DNS=xxx.xxx.xxx.xxx # 1つめのDNS
        DNS=xxx.xxx.xxx.xxx # 2つめのDNS

    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=timezone
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
        
users: # ユーザ名を指定（ログインユーザ）
  - name: core
    passwd: $1$7JJbYswv$lw0lVUsj2aDnr7h2DiIH.1 "$ sudo openssl passwd -1" の結果を貼り付ける。
    groups:
      - sudo
      - docker
```

<b>5.作成したcloud-config.ymlを使用してOSインストールを実施する。</b>
$ sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml

<b>6.以下のようになればOSインストール成功。</b>

```
Installing cloud-config...  
Success! CoreOS stable 766.4.0 is installed on /dev/sda
```

<b>7.OSインストール完了後、再起動を実施し、SSH接続できることを確認する。</b>
$ sudo shutdown -r now


以上。

## その他：よく使うコマンドたち（メモ）
1.core ユーザのパスワード変更
$ sudo passwd core

2.ネットワークカードの再起動
$ sudo systemctl restart systemd-networkd

3.静的ネットワーク設定ファイル
/etc/systemd/network/static.network
どうしても Docker on Ubuntu 18.04 on WSL したかった

WSL上でDocker Engineが動くようになっていたっぽいという話
https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87

上の記事を見て喜び勇んでやってみたら、最新のDockerでは動きませんでした.... と言うお話です。

(更新 2019/02/26) 私は結局、開発環境としてのWindowsから離れてしまったので試していませんが、Build 17713では動いたようだったので、現行ビルド (RS5, Version 1809, Build 17763.316) では普通に動くんじゃ無いかなと思います。

## 環境
* Windows 10 Pro
    * Version 1803
    * Build 17134.165
* Ubuntu 18.04
  * ~~16.04で `docker.io` を使うのであれば、バージョンが古いので多分あっさり動くと思います。~~  
    動かないらしいです。調べてはいないですが、16.04のdocker.ioパッケージのバージョンが上がっているのかも。 (thx @ytakashina)

## とりあえず試したら....
```bash
% sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Extracting [==================================================>]     985B/985B
docker: failed to register layer: Error processing tar file(exit status 1): invalid argument.
See 'docker run --help'.
```

がーん

最初はk8sが使ってみたかったため、docker 公式パッケージ `docker-ce (18.06.0~ce~3-0~ubuntu)` をインストールするもダメ。
Ubuntuが用意してくれているパッケージ `docker.io (17.12.1-0ubuntu1)` もダメでした。

## どうすれば動くんだろう
と、言う事でいろいろ調べたところ、元々Docker on WSLについて議論が行われていたRedditのスレに答えがありました。

https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/dxxn30d/

> That is this change . WSL doesn't support MS_SLAVE in mount. That error appears since docker-ce 17.09.1 but it's easy to fix if you compile latest docker yourself.

Docker 17.09.1 からマウント時に使うようになった `MS_SLAVE` と言うのをWSLがサポートしていないのが原因らしい。

取り急ぎ 17.09.0 で試してみる。

```bash
% curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
% sudo dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb
% docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```

動いた。

と、言う事で現状どうしても Docker on Ubuntu 18.04 on WSL したいのであれば、以下の内のどれかを選ぶしか無さそうです。

1. 17.09.0 を使う
2. 以下コミットをRevertして自分でビルドして使う (未検証)  
   https://github.com/docker/docker-ce/commit/6c6a1827cfc6c221c0477f55f20758a6e5487e5e
3. WindowsをInsider Preview版にする (未検証。ビルド17666でMS_SLAVEがサポートされたらしい)  
   RS5 の slow ring (build 17713) では hello-world が動いたらしいです。 (thx @hanotch)
4. RS5のリリースを待つ (秋くらいですかね？)

もちろんDocker for Windowsと併用するのもアリだと思います。

WSL(Bash on Windows)でDockerを使用する
https://qiita.com/yoichiwo7/items/0b2aaa3a8c26ce8e87fe
Google Cloud Vision APIで光学式文字認識

## Google Cloud Vision APIとは
Google Cloud Platformで提供されている画像解析のためのAPIでラベル検出や顔の検出などいろいろできる。
今回はその中で手書き画像から光学式文字認識(ORC)をする。

##  Google Cloud Vision API の APIキー取得
以下のサイトを参考に、
Google Cloud PlatformのAPIキーの取得をした。
[Cloud Vision APIの使い方まとめ](https://syncer.jp/cloud-vision-api)

## 参考文献
以下のページで公開されているコードを参考にプログラムを作成した。
・Python3でGoogle Cloud Vision APIを使い、ホットペッパーの画像をラベル検出している
[【Python】GoogleCloudVisionAPIを使って、ホットペッパーの画像で肉々しいお店を判定できないか試してみた](https://kiito.hatenablog.com/entry/2016/05/14/174149)

## 作成したコード
以下に作成したコードを示す。
今回は文字認識したText部分のみがほしいため、そこだけを取り出す

```python3:ocr.py
import requests
import base64
import json

GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key='
API_KEY = 'APIキー' # 取得したAPIキーを入力してください。

# APIを呼び、認識結果をjson型で返す
def request_cloud_vison_api(image_base64):
    api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY
    req_body = json.dumps({
        'requests': [{
            'image': {
                'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する
            },
            'features': [{
                'type': 'TEXT_DETECTION', # ここを変更することで分析内容を変更できる
                'maxResults': 10,
            }]
        }]
    })
    res = requests.post(api_url, data=req_body)
    return res.json()

# 画像読み込み
def img_to_base64(filepath):
    with open(filepath, 'rb') as img:
        img_byte = img.read()
    return base64.b64encode(img_byte)

# 文字認識させたい画像を./img.pngとする
img_base64 = img_to_base64('./img.png')
result = request_cloud_vison_api(img_base64)

#認識した文字の位置など、すべての情報を出力
#print("{}".format(json.dumps(result, indent=4)))

#認識した文字のみを出力
text_r = result["responses"][0]["fullTextAnnotation"]["text"]
print(text_r)
```

## 結果
今回は、簡単な文字画像をつかって認識させてみた。
結果として、文字の正しい認識は出来るが、謎のスペースが入ってしまった。
APIから返された結果は、非常に長いため省略するが、文字間隔が広いため「ABCD」,「E」,「F」に区切られて読み取れているらしい

<img width="300" alt="img.png" src="https://qiita-image-store.s3.amazonaws.com/0/275134/611c106a-0052-8365-e949-c7ba83c5d6ee.png">

```
ABCD E F
12345
あいうえお
```


また、Qiitaのロゴを読み込ませたところ、うまくいった！

<img width="300" alt="img.png" src="https://qiita-image-store.s3.amazonaws.com/0/275134/07b73d21-6aed-f62b-d026-6f5b42e5bc96.png">

```
Qiita

```
OpenJDK8をRPMでインストールする

OracleJDKからOpenJDKに移行することになったので、OpenJDKのインストール手順をまとめるよ。

# 前提条件
* 既存のOracleJDKは残しておく
* 諸事情によりyumでまるっとインストールはしない（余計なものは入れない）rpm版で。
* develはインストールしない（必要であればしてください）

# 環境
```
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

# 手順
### 1. openJDKをゲットする
ここのサイトあたりから探すと良いかも。
https://pkgs.org/download/openjdk
今回落としてきたのは
    * java-1.8.0-openjdk-headless-1.8.0.171-7.b10.el7.x86_64.rpm
    * java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64.rpm

```
$ wget 'http://mirror.centos.org/centos/7/updates/x86_64/Packages/java-1.8.0-openjdk-headless-1.8.0.171-7.b10.el7.x86_64.rpm'
$ wget 'http://mirror.centos.org/centos/7/updates/x86_64/Packages/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64.rpm'
```
### 2. いろいろアップデート

そのままインストールしてもエラーになるので、以下をupdate

```
$ yum update copy-jdk-configs
$ yum update nss
```
### 3. インストール
headlessがメインなので、headlessを先にインストールしましょう。

```
$ rpm -ivh java-1.8.0-openjdk-headless-1.8.0.171-7.b10.el7.x86_64.rpm
$ rpm -ivh java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64.rpm
```
インストール先は/usr/lib/jvmに。OracleJDKと全然違うなぁ。

```
/usr/lib/jvm
drwxr-xr-x 3 root root 16  5月  9 22:55 java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64
lrwxrwxrwx 1 root root 21  7月 26 15:30 jre -> /etc/alternatives/jre
lrwxrwxrwx 1 root root 27  7月 26 15:30 jre-1.8.0 -> /etc/alternatives/jre_1.8.0
lrwxrwxrwx 1 root root 35  7月 26 15:30 jre-1.8.0-openjdk -> /etc/alternatives/jre_1.8.0_openjdk
lrwxrwxrwx 1 root root 49  7月 26 15:30 jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64 -> java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/jre
```
### 4. バージョン管理の確認
alternativeで管理するらしい。rpmでインストールしたら自動的にopenjdkの方を向いてたので、今回は割愛。

```
# alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/java/jdk1.8.0_162/jre/bin/java
*+ 2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
```
### 5. java -versionで確認できるバージョンの向き先を変える
/etc/profile.d/java.shのJAVA_HOMEを書き換える必要があるらしい
yumだと書き換えてくれるんだろうか。。

```
$ cd /etc/profile.d/
$ vi java.sh
export JAVA_HOME=/etc/alternatives/jre #これ追加
#export JAVA_HOME=/usr/java/latest #コメントアウト or delete

$ source /etc/profile.d/java.sh
$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
```
### おまけ
tomcatとかでJAVA_HOMEを設定してるやつらがいたら変えるのを忘れずに。
/opt/java で設定していたら、以下のシンボリックリンクを変えると割と平和的に解決する

```
# cd /opt
java -> /usr/java/latest
# rm java
# ln -s /etc/alternatives/jre java
java -> /etc/alternatives/jre
```

# 参考
* CentOS 7にJDK(openJDK)をインストールする(rpm)
https://internalservererror.info/2018/04/29/centos-7%E3%81%ABjdk%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8Brpm/
* 参考メモ/CentOS7 の OpenJDK パッケージの構成メモ(@msakamoto_sf 様)
https://qiita.com/msakamoto_sf/items/92d421bf724efa740350
* CentOSのalternativesでJavaのバージョン管理
http://www.task-notes.com/entry/20150530/1432954800
kubernetesのPersistentVolume管理を考えてみる

# はじめに

最近、kubernetesを使ってシステム構築に挑戦しています。
その途中、PersistentVolume (以下pv) を使う必要が出てきたため、どうやって管理するのがいいか考えてみました。

まだまだ試行錯誤の段階なので、「こんなふうにすれば良くなる」とか「ここがイケてない」とかいろんな意見募集中です。

# pvの定義のしかた

まずは例から。
簡単なのでとりあえずhostPathで定義してますが、各クラスタの環境に合った方法で定義するのが良いと思います。

```yaml:persistent-volumes.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001
  labels:
    project: project-one # このVolumeに割り当てるプロジェクトを指定する
spec:
  capacity:
    storage: 512Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: "/var/pv0001"
    type: DirectoryOrCreate

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0002
  labels:
    project: project-two
spec:
  capacity:
    storage: 256Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: "/var/pv0002"
    type: DirectoryOrCreate
```

ポイントは、プロジェクト毎に割り当てるVolumeをラベルで指定していること。
これの狙いは、

* PersistentVolumeClaim (pvc) のselectorが書きやすくなる
* 後からpvを追加しやすくなる

ひとつめのselectorが書きやすくなるという例が以下です。
matchLabelsでプロジェクト名だけ指定しとけば良いという環境を作れます。

```yaml:project-one/persistent-volume-claims.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: project-one-foo-pvc
  labels:
    project: project-one
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 128Gi
  selector:
    matchLabels:
      project: project-one # キーが "project", 値が "project-one" というラベルを持つVolumeのどれかにバインドされる

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: project-one-bar-pvc
  labels:
    project: project-one
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 64Gi
  selector:
    matchLabels:
      project: project-one
```

ふたつめの「後からpvを追加しやすくなる」というのは、たとえば、project-twoで必要なボリュームが足りなくなったので追加したいときには、以下のようなpv定義を追加すれば良くなります。

```yaml:persistent-volumes.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
  labels:
    project: project-two
spec:
  capacity:
    storage: 512Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: "/var/pv0003"
    type: DirectoryOrCreate
```

こうすることで、pvcを書く人にとってはpvが追加されたことを意識せずに済みます。

# おわりに

ラベルの使い方が難しい。
うまく使えたらすごく便利になりそうなのだけれど…。
ExcelVBAでfindで見つけたセルをそのままrangeに代入するとエラーが出る

##何の話か
ExcelVBAでfind使って検索した結果を使おうとしたのに1004エラーが出て使えない。
どうすりゃええねん、をさんざん調べてとりあえず解決したのでメモを残しておく、という話


##エラー概要

問題のコードがこれ。

```vb:samplecode.bas
Sub getOrgNameCell()
    dim orgnamecell as range

    Set orgnamecell = Cells.Find(what:="組織名")
    test = Range(orgnamecell).Column
    MsgBox test

End Sub
```

これを実行すると、

>実行時エラー '1004':
> 'Range'メソッドは失敗しました: '_Global' オブジェクト

と返ってきてエラーになる。

##エラーの原因
range(orgnamecell)を実行するときに、findで見つけてきたセルorgnamecellが、「どのシートのセルなのか」がわかっていないのが原因。らしい。
以下のURLを見ると、丁寧に説明されている。

[Yahoo知恵袋:エクセルマクロでRange(Cells(w, x), Cells(y,z)).Selectがうまくいきません](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1294755542)
[教えてgoo:VBA 実行時エラー1004　rangeメソッドは失敗しました。globalオブジェクトのエラー](https://oshiete.goo.ne.jp/qa/4651404.html)

だがよくわからん。
言われた通りいろいろ弄っても結果は変わらず、何がいけないのよ？となって、
最終的に「とりあえずこうしておけば解決するっぽい」方法がわかった。ので書く。

##解決方法

range()で囲わず、直接オブジェクトからプロパティを指定する。

```vb:test.bas
Sub getOrgNameCell()
    dim orgnamecell as range

    Set orgnamecell = Cells.Find(what:="組織名")
    test = orgnamecell.Column
    MsgBox test

End Sub
```

宣言したオブジェクト自体がプロパティを持ってるので、わざわざrange(range)ってやらなくてもいい。

<details><summary>修正前(.addressで無理やり解決する)</summary><div>

.addressつければ意図通りに動く。

```vb:test.bas
Sub getOrgNameCell()
    dim orgnamecell as range

    Set orgnamecell = Cells.Find(what:="組織名")
    test = Range(orgnamecell.Address).Column
    MsgBox test

End Sub
```

セルを参照しようとして「どのシートやねん」ってなるからエラーを吐くので、
どのシートだかわからんけどセル番地はわかってるorgnamecellから、番地(.address)だけ持ってくればエラーにはならないよ、と。

詳しい、きちんとした説明はできないけど解決したのでよしとする。
</div></details>